yield return-Anweisung in einem using () {} -Block Wird vor der Ausführung gelöscht

Ich habe meine eigene benutzerdefinierte Datenebene geschrieben, um sie in einer bestimmten Datei beizubehalten, und ich habe sie mit einem benutzerdefinierten DataContext-Muster abstrahiert.

Dies alles basiert auf dem .NET 2.0 Framework (vorgegebene Einschränkungen für den Zielserver). Auch wenn einige davon wie LINQ-to-SQL aussehen, ist dies nicht der Fall! Ich habe gerade ein ähnliches Datenmuster implementiert.

Das folgende Beispiel zeigt eine Situation, die ich noch nicht erklären kann.

Um alle Instanzen von Animal zu bekommen, mache ich das und es funktioniert gut

public static IEnumerable<Animal> GetAllAnimals() {
        AnimalDataContext dataContext = new AnimalDataContext();
            return dataContext.GetAllAnimals();
}

Und die Implementierung der GetAllAnimals () -Methode im AnimalDataContext () unten

public IEnumerable<Animal> GetAllAnimals() {
        foreach (var animalName in AnimalXmlReader.GetNames())
        {
            yield return GetAnimal(animalName);
        }
}

AnimalDataContext () implementiert IDisposable, da ich einen XmlTextReader darin habe und sicherstellen möchte, dass er schnell bereinigt wird.

Nun, wenn ich den ersten Aufruf in eine using-Anweisung wie diese einbinde

public static IEnumerable<Animal> GetAllAnimals() {
        using(AnimalDataContext dataContext = new AnimalDataContext()) {
            return dataContext.GetAllAnimals();
        }
}

Setzen Sie einen Haltepunkt in die erste Zeile der AnimalDataContext.GetAllAnimals () -Methode und einen weiteren Haltepunkt in die erste Zeile der AnimalDataContext.Dispose () -Methode und führen Sie Folgendes aus:

Die Dispose () -Methode heißt FIRST, sodass AnimalXmlReader.GetNames () die Ausnahme "Objektreferenz nicht auf Objektinstanz gesetzt" angibt, da AnimalXmlReader in Dispose () auf null gesetzt wurde.

Irgendwelche Ideen? Ich habe eine Ahnung, mit der es zu tun hatRendite zurück darf nicht in einem try-catch-Block aufgerufen werden, dermit effektiv repräsentiert, einmal kompiliert ...

Antworten auf die Frage(2)

Ihre Antwort auf die Frage