相关疑难解决方法(0)

using(){}块内的yield return语句在执行之前处置

我已经编写了自己的自定义数据层来保存到特定文件,并使用自定义DataContext模式对其进行抽象.

这完全基于.NET 2.0 Framework(给定目标服务器的约束),所以尽管其中一些可能看起来像LINQ-to-SQL,但它不是!我刚刚实现了类似的数据模式.

请参阅下面的示例,以了解我无法解释的情况示例.

获取Animal的所有实例 - 我这样做,它工作正常

public static IEnumerable<Animal> GetAllAnimals() {
        AnimalDataContext dataContext = new AnimalDataContext();
            return dataContext.GetAllAnimals();
}
Run Code Online (Sandbox Code Playgroud)

并在下面的AnimalDataContext()中实现GetAllAnimals()方法

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

AnimalDataContext()实现了IDisposable,因为我在那里有一个XmlTextReader,我想确保它快速清理.

现在,如果我将第一个调用包装在using语句中,就像这样

public static IEnumerable<Animal> GetAllAnimals() {
        using(AnimalDataContext dataContext = new AnimalDataContext()) {
            return dataContext.GetAllAnimals();
        }
}
Run Code Online (Sandbox Code Playgroud)

并在AnimalDataContext.GetAllAnimals()方法的第一行放置一个断点,在AnimalDataContext.Dispose()方法的第一行放置另一个断点,然后执行...

Dispose()方法被称为FIRST,因此AnimalXmlReader.GetNames()给出"对象引用未设置为对象的实例"异常,因为在Dispose()中AnimalXmlReader已设置为null ???

有任何想法吗?我有一种预感,它关系到产生收益没有被允许一个try-catch块,其内部被称为使用有效的代表,编译一次...

c# idisposable using yield-return .net-2.0

49
推荐指数
2
解决办法
1万
查看次数

标签 统计

.net-2.0 ×1

c# ×1

idisposable ×1

using ×1

yield-return ×1