@@ -1100,19 +1100,10 @@ public struct Enumerator
11001100 private readonly string ? _value ;
11011101 private int _index ;
11021102 private readonly int _final ;
1103+ private char _ch ;
11031104
11041105 /// <inheritdoc cref="IEnumerator{T}.Current" />
1105- public readonly char Current
1106- {
1107- [ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
1108- get
1109- {
1110- if ( ( uint ) _index >= ( uint ) _final )
1111- ThrowHelper . ThrowArgumentOutOfRangeException ( ) ;
1112-
1113- return _value ! . GetRawStringData ( _index ) ;
1114- }
1115- }
1106+ public readonly char Current => _ch ;
11161107
11171108 /// <summary>
11181109 /// Initializes a new instance of the <see cref="Enumerator"/> structure.
@@ -1130,8 +1121,24 @@ internal Enumerator(StringView view)
11301121 [ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
11311122 public bool MoveNext ( )
11321123 {
1133- ++ _index ;
1134- return ( uint ) _index < ( uint ) _final ;
1124+ #if NET9_0_OR_GREATER
1125+ //
1126+ // The "_value is not null" condition is hoisted and checked only once
1127+ //
1128+ if ( _value is not null && ( uint ) ++ _index < ( uint ) _final )
1129+ {
1130+ _ch = _value ! . GetRawStringData ( _index ) ;
1131+ return true ;
1132+ }
1133+ #else
1134+ if ( ( uint ) ++ _index < ( uint ) _final )
1135+ {
1136+ _ch = _value ! . GetRawStringData ( _index ) ;
1137+ return true ;
1138+ }
1139+ #endif
1140+
1141+ return false ;
11351142 }
11361143 }
11371144
@@ -1147,18 +1154,10 @@ private sealed class StringViewEnumerator : IEnumerator<char>
11471154 private readonly string ? _value ;
11481155 private int _index ;
11491156 private readonly int _final ;
1157+ private char _ch ;
11501158
11511159 /// <inheritdoc />
1152- public char Current
1153- {
1154- get
1155- {
1156- if ( ( uint ) _index >= ( uint ) _final )
1157- ThrowHelper . ThrowArgumentOutOfRangeException ( ) ;
1158-
1159- return _value ! . GetRawStringData ( _index ) ;
1160- }
1161- }
1160+ public char Current => _ch ;
11621161
11631162 /// <summary>
11641163 /// Initializes a new instance of the <see cref="StringViewEnumerator"/> class.
@@ -1174,8 +1173,13 @@ public StringViewEnumerator(StringView view)
11741173 /// <inheritdoc />
11751174 public bool MoveNext ( )
11761175 {
1177- ++ _index ;
1178- return ( uint ) _index < ( uint ) _final ;
1176+ if ( ( uint ) ++ _index < ( uint ) _final )
1177+ {
1178+ _ch = _value ! . GetRawStringData ( _index ) ;
1179+ return true ;
1180+ }
1181+
1182+ return false ;
11791183 }
11801184
11811185 /// <inheritdoc />
0 commit comments