我遇到了一件真正让我大吃一惊的事情。
例子
class A
{
DataSet aDs;
void AFoo()
{
var b = new B();
b.BFoo();
aDs = b.bDs;
b.Dispose();
//для объекта DataSet уже выполнен Dispose,
//но мы продолжаем работать с ним,
///как ни в чём не бывало
var newrow = aDs.Tables[0].NewRow();
FillNewRow(newrow);
aDs.ows.Tables[0].Add(newrow);
}
}
class B : IDisposable
{
public DataSet bDs;
public void BFoo()
{
bDs?.Dispose();
bDs = new DataSet();
bDataAdapter.Fill(bDs);
}
// IDisposable Support
protected virtual void Dispose(bool disposing)
{
if (!disposedValue)
{
if (disposing)
{
bDs?.Dispose();
}
disposedValue = true;
}
}
}
创建了一个对象,该对象B
创建了一个对象DataSet
并将其保存在公共字段中。从这个公共字段复制一个引用,并在内部调用它Dispose
的对象,也调用它。但是我们继续使用它( c ),就好像什么都没有被调用一样。为什么会这样?B
Dispose
DataSet
DataSet
您无需寻找解释 - C# 文档。
我们查看继承的类型并在其中看到MarshalByValueComponent,它实现了IDisposable:
然而,它本身并
DataSet
没有覆盖Dispose()
,所以调用这个方法实际上什么也没做。这会释放模块资源MarshalByValueComponent
,但这不会以任何方式影响 DataSet。要获得更“官方”的答案,您可以访问所有相同的文档并查看 DataSet.Dispose:
似乎根本不需要调用 Dispose(),关于这个主题有一个非常有趣的“纸浆”。