Optimized struct enumerators #3341
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Follow up for #3128 and #3273
PR Type
What kind of change does this PR introduce?
@michael-hawker NOTE: this PR has no functional changes, I literally just shuffled some code around and removed some unnecessary types (as I've moved the code to the parent types). All the existing methods and operations are exactly the same as before, I didn't change anything at all there.
What is the current behavior?
The
Span<T>
/T[]
/T[,]
enumerators use a secondary enumerator type to perform the actual enumeration. This causes an unnecessary initial copy of the captured values, and introduces a second generic type with a couple method that the JIT compiler has to compile to native code (for value types).What is the new behavior?
The
GetEnumerator()
now simply returnsthis
, so the second type is no longer needed. All the enumeration methods are added directly to the first type. The enumerator types are no longer marked asreadonly
to allow direct enumeration on them. This is not a problem since those were always supposed to be used once anyway and never store anywhere (as they'reref struct
types).PR Checklist
Please check if your PR fulfills the following requirements:
Pull Request has been submitted to the documentation repository instructions. Link:Sample in sample app has been added / updated (for bug fixes / features)Icon has been created (if new sample) following the Thumbnail Style Guide and templates