我有一些关于一次性课程的问题。假设我有一个IDisposable
具有一些一次性成员的实现类。我已经实现了该Dispose()
方法,即:
class BaseCustom: IDisposable
{
private System.Net.Sockets.TcpClient tc;
private System.Net.Sockets.NetworkStream ns;
public string str;
public int i;
public BaseCustom(string host, int port)
{
tc = new System.Net.Sockets.TcpClient(host, port);
ns = tc.GetStream();
}
// some other methods work on members (i, str, tc, ns)
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
if (ns != null)
{
ns.Close();
ns = null;
}
if (tc != null)
{
tc.Close();
tc = null;
}
}
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
Q1)既然没有非托管资源,可以压制finalizer吗?(在此处阅读代码中的注释)
Q2)既然我们处理了一次性成员并压制了 GC,那么这里的成员int
和string
成员会发生什么?我们是否也需要处理它们?
Q3)电流释放是否tc
合适ns
?我看到不同版本的 .NET 引用中关于调用Close()
与调用的差异。Dispose()
现在假设我们有一个派生类:
class DerivedCustom : BaseCustom
{
public string cstr;
public int ci;
public DerivedCustom(string host, int port)
: base(host, port)
{}
// some extra methods
}
Q4)可能与Q2有关;我们需要在这里覆盖任何Dispose()
s 吗?我们不会在派生类中引入任何非托管或一次性资源。保持原样是否安全(即相信基地的处置机制)?如果GC 被抑制(它在派生中也被抑制,对吧),ci
会发生什么?cstr
也与 Q1 相关,我们是否需要任何终结器?
Q5)如果基类是抽象类怎么办?
Q6)这很有趣;原样的代码没有给出关于 FxCop 1.36 中可处置性的任何警告。但是,如果我将一次性成员添加到DerivedCustom
并且仍然不覆盖一次性方法(因此不处理新成员),例如:
class DerivedCustom : BaseCustom
{
public string cstr;
public int ci;
// below is the only extra line
public System.Net.Sockets.TcpClient ctc = new System.Net.Sockets.TcpClient("ho.st", 1234);
public DerivedCustom(string host, int port)
: base(host, port)
{}
// some extra methods
}
在 FxCop 中仍然没有收到任何警告。这有点让我吃惊,因为处置ctc
似乎没有得到妥善处理。