这个主题在SO上有很多问题,但我没有找到一个涵盖我需要理解的内容。
我的其中一位开发人员编写了这段代码:
//
// ValidationDataTable is a typed DataTable, generated by the Framework
ValidationDataTable validationTable;
using (ValidationTableAdapter adapter = new ValidationTableAdapter ()) {
using (validationTable = adapter.GetData()) { }
}
datafeedValidators.Add(new CountryFieldValidator(validationTable.ToDictionary(key => key.CountryCode, value => value.CountryName)));
// Party on...
//
我的理解:当在最后的代码行中引用validationTable时,它已被处理但未进行垃圾回收 - 但应该仍会在.ToDictionary()调用上抛出ObjectDisposedException。但是这段代码愉快地构建了一个有效的字典并继续运行。
我有一些理论,但找不到任何确凿的证据来确认或否决其中任何一个。并且可以以一打的方式重写代码以避免问题; 这不是问题。我只需要知道我理解上的差距在哪里。
我的问题:
1.这段代码是否有效且表现正常?
2.如果不是,我们看到的成功只是一个胡乱猜测吗?
3.关于DataTable的特定内容是否允许在对象被处理后访问 - 类似于GZipStream类需要您处理对象以刷新流,因此允许在处理对象后调用.ToArray()和.GetBuffer()?
4....当您调用方法时,实际上是什么导致ObjectDisposedException被抛出?我一直认为这来自.NET Framework本身。
澄清:
这是一个.NET Framework问题。 共识是我的理解是正确的 - DataTable本身必须抛出ObjectDisposedException。 除了它没有。 不在DataTable源代码中 - 因此我问。 我假设框架将确保在处理后抛出ObjectDisposedException,显然不是这种情况......与GZipStream不同,它只允许在Dispose()之后访问两个方法,DataTable DGAF。 好的。
那么,让我重述问题:是否有任何内部的DataTable会因为允许调用已处理表而炸弹我们? 我可以假设Microsoft在内部没有清理任何内容,所有属性和值将保持原样,在对象在范围内的时间内未经触摸......这似乎不是一个安全的假设。不管怎样,这段代码都将消失 - 我只是想知道Microsoft允许在Dispose()后访问DataTable是否有故意的原因或是疏忽,不关心等等。
此外,如果您对问题进行了downvote或投票关闭,请留下评论说明原因。
DataTable
在被处理时实际上并没有做任何事情。这是一些争议的来源,但要明确的是,处理一个 DataTable 不会有任何影响。4. 这取决于特定类的实现。框架和语言都不关心处理。我建议您阅读可处理模式的相关内容。 - Glorin OakenfootDataTable
的Dispose
实现是从其父类继承的,因此它不一定在DataTable
中执行任何操作。类在处置后访问时并不总是会抛出ObjectDisposedException
异常,比如MemoryStream
。 - Lee