我编写了自己的自定义数据层以将数据持久化到特定文件,并使用自定义DataContext模式进行了抽象。
这完全基于.NET 2.0框架(给定目标服务器的限制),因此即使其中一些看起来像LINQ-to-SQL,也不是!我只是实现了类似的数据模式。
请参考下面的示例,其中有一个我尚未解释清楚的情况。
要获取所有Animal
的实例-我执行以下操作,它可以正常工作
public static IEnumerable<Animal> GetAllAnimals() {
AnimalDataContext dataContext = new AnimalDataContext();
return dataContext.GetAllAnimals();
}
以下是 AnimalDataContext
中 GetAllAnimals()
方法的实现:
public IEnumerable<Animal> GetAllAnimals() {
foreach (var animalName in AnimalXmlReader.GetNames())
{
yield return GetAnimal(animalName);
}
}
AnimalDataContext
实现了 IDisposable
,因为我在其中使用了一个 XmlTextReader
,我想确保它被迅速清理掉。
如果我像下面这样在第一次调用外层加上 using
语句:
public static IEnumerable<Animal> GetAllAnimals() {
using(AnimalDataContext dataContext = new AnimalDataContext()) {
return dataContext.GetAllAnimals();
}
}
在 AnimalDataContext.GetAllAnimals()
方法的第一行设置一个断点,并在 AnimalDataContext.Dispose()
方法的第一行设置另一个断点,然后执行...
Dispose()
方法首先被调用,所以当在 Dispose()
中将 AnimalXmlReader
设置为 null
后,在调用 AnimalXmlReader.GetNames()
时会抛出“对象引用未设置为对象实例”的异常。
有什么想法吗?我有一种预感,这可能与不允许在 try-catch 块内调用 yield return
有关,而 using
在编译后就像是代表了它...