使い捨てクラスについていくつか質問があります。いくつかの使い捨てメンバーを持つ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)アンマネージリソースがないので、ファイナライザを抑止してもいいですか? (ここのコードのメモを読んでください)
Q2)使い捨てメンバを破棄して GC を抑制したので、ここのint
andstring
メンバはどうなりますか? それらも処理する必要がありますか?
Q3)tc
現在の解放はns
適切ですか?Close()
呼び出しと呼び出しについて、バージョン間で.NET参照内に違いがあります。Dispose()
派生クラスがあるとします。
class DerivedCustom : BaseCustom
{
public string cstr;
public int ci;
public DerivedCustom(string host, int port)
: base(host, port)
{}
// some extra methods
}
Q4) Q2 に関連している可能性があります。ここで sをオーバーライドする必要がありますDispose()
か? 派生クラスにアンマネージまたは使い捨てのリソースを導入しません。それをそのままにしておいても安全ですか (つまり、ベースの破棄メカニズムを信頼します)? 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
の処分が適切に処理されていないように見えるので、これはちょっと驚きです。