我有一些關於一次性類的問題。假設我有一個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)由於沒有非託管資源,是確定surpress終結? (在代碼閱讀note這裏)
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()
?我們不會在派生類中引入任何非託管或可支配資源。是否可以保持原樣(即信任基地的處置機制)?如果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
的處置似乎沒有妥善處理。
+1。所有優秀的答案。不過,我會澄清,因爲int是值類型,當它們駐留的對象被垃圾收集時,它們消耗的空間會自動刪除。 – StriplingWarrior
關於A5,也不需要檢查它們是否爲空 - 構造函數將確保它們被設置。只需在沒有檢查或分配的情況下連續運行Dispose()。 –
@ JesseC.Slicer好點,但它可能是一個很好的習慣,因爲這只是* this *類的不變性;在其他情況下,可能需要空檢查。 – phoog