Start here. This is the direct spoken answer to practice first.
Why this question matters
An iterator method looks like a normal method but its body advances in stages controlled by the consumer. Resource lifetime follows enumeration, not merely the call that produced the sequence.
A method containing yield return is compiled into an iterator state machine. Calling the method returns an enumerable without normally running the body to completion; each MoveNext continues execution until the next yielded value or the end. Local variables become state carried between those calls. If the consumer uses foreach, the enumerator is disposed when the loop ends, including when it exits early, so finally blocks in the iterator can release resources.