- Published on
LINQ in .NET - Things I learned #2
- Authors
- Name
- Tylah Kapa
- @jadekapa
We're back with part 2! You can find part 1 here!
I've got a long train ride, so I'm not sure where I'll stop with this one.
Here's where we left off:
- We're trying to re-implement
Select()
from scratch - Stephen has implemented
SelectCompiler()
- Stephen has started to implement his own
SelectManualEnumerable<TSource, TResult>
to show us how it's implemented - Stephen also started to implement his own
Enumerator: IEnumerator<TResult>
class
Here's the video! Let's get into it.
5... or more things I learned watching this video
object Current
inIEnumerator
has nullable reference types disabled in the .NET Source. "Oblivious" as the source puts it.- A great reminder that https://source.dot.net/ exists.
Reset()
will throw aNotSupportedException()
. Most Enumerators in .NET will do this... pretty interesting.throw e
is not the same asthrow
throw e
will change the stacktrace information!!
try {
...
}
catch (Exception e) {
throw e;
}
Bad Example: throw e
will change the stacktrace information!
try {
...
}
catch {
throw;
}
Good Example: throw
knows how to preserve the stacktrace information on its own.
Enumerators track their state so that they know where to resume from.
- e.g. 1 = initialise enumerator, 2 = perform
MoveNext()
- e.g. 1 = initialise enumerator, 2 = perform
Watching Stephen code is interesting. I've never thought about zoom level as a tool to view my progress in implementation.
You can use
_
to separate numbers?!10_000
is the same as10000
. You can bet I'll probably use that for visual clarity.
Let's leave it there for now
The end of the train ride is coming up. Let's continue on the way back.
Where we left off:
- Timestamp: 1:01:08 (TODO: grab the link once I get internet)
- Looking at the profiler, Stephen's implementation creates an extra object.
- Stephen refactored out the
sealed Enumerator
class and let's theSelectManualEnumerable
be it's ownEnumerator
instead. - However, now things are broken, an extra state needs to be accounted for.