我正在使用代表数据库表的第三方类Table。 该类具有Close()方法,并实现IDispose。
我发现在这样的表上多次调用Close()很好。 同样,多次调用Dispose()也可以。
但是,如果我调用Dispose(),我将无法再次调用Close(),否则将得到ObjectDisposedException。
我想使用此类表作为类中的私有成员变量。
Table类提供者提供的样本不会在表上调用Dispose()。 但是,由于调用Dispose()后再调用Close()会导致崩溃,因此我认为Dispose()会进行完全清理吗?
因此,我得出结论,我必须先调用Close(),然后调用Dispose()一次?
实现此目标的最佳方法是什么? 我应该让我的类实现IDispose并使用Dispose模式和一个bool deposited_变量来确保清理仅执行一次,然后在Dispose方法中使用GC.SuppressFinalize吗?
我已经实现了这种模式,并了解了它的工作原理。
但是我对这有多复杂感到困惑。我认为C#代码会比C ++简单。
还有另一种更简单/更好的方法吗?
答案 0 :(得分:0)
安迪,你好,这里是一个很好的例子IDisposable Interface 它包含如何处置托管和非托管资源。
如果我们用MemoryStream替换Table3rd,则它具有Close和Dispose方法。我们可以做到这一点 Fiddle
using System;
using System.IO;
public class Table3rd : MemoryStream{
};
public class MyTable : IDisposable
{
public Table3rd Data { get; private set; }
public MyTable(){
Data = new Table3rd();
}
private bool disposed;
public void Close()
{
Dispose(true);
GC.SuppressFinalize(this);
}
public void Dispose(bool disposing)
{
if (!disposed)
{
try
{
if (disposing)
{
Data?.Dispose();
disposed = true;
}
}
finally
{
Dispose(disposing);
}
}
}
public void Dispose()
{
Close();
}
}
public class Program
{
public static void Main()
{
var table = new MyTable();
var data = table.Data;
var writer = new StreamWriter(data);
writer.Write("Table data");
writer.Flush();
data.Position = 0;
var reader = new StreamReader(data);
var mensaje = reader.ReadToEnd();
Console.WriteLine(mensaje);
// Too many dispose
table.Close();
table.Dispose();
table.Close();
table.Dispose();
}
}
我希望它对您有用。