[英]Change the Dispose method on 'ReproClass' to call Dispose or Close on this field
[英]Instance method call Dispose
公共方法在同一個類中調用IDisposable的Dispose是否正確?
例如
public class Worker : IDisposable
{
public void Close()
{
SendCloseCommand();
Dispose();
}
public void Dispose()
{
////other resources release
}
private void SendCloseCommand()
{
}
}
關於一次性模式的另一個問題:如果應該總是調用Close,那么從Dispose方法調用是否更好?
如果不是這樣,我應該把工人類的用法在一個try / catch /終於無處不在,調用Close。 對?
應該是正確的設計嗎?
public class Worker : IDisposable
{
public void Close()
{
SendCloseCommand();
}
public void Dispose()
{
Close();
////other resources release
}
private void SendCloseCommand()
{
////other stuff
}
}
如果您查看StreamReader
Microsoft實現 ,則從Close
調用Dispose
,
public override void Close()
{
Dispose(true);
}
並且Dispose
的實現也通過調用Close
of base Stream
Close
Stream
。
protected override void Dispose(bool disposing)
{
// Dispose of our resources if this StreamReader is closable.
// Note that Console.In should be left open.
try {
// Note that Stream.Close() can potentially throw here. So we need to
// ensure cleaning up internal resources, inside the finally block.
if (!LeaveOpen && disposing && (stream != null))
stream.Close();
}
finally {
if (!LeaveOpen && (stream != null)) {
stream = null;
encoding = null;
decoder = null;
byteBuffer = null;
charBuffer = null;
charPos = 0;
charLen = 0;
base.Dispose(disposing);
}
}
}
在您的類實現中,我將在您的第一個代碼片段中使用Close
方法調用Dispose
。 在Dispose
,我會檢查Worker
狀態,如果它沒有關閉,則使用SendCloseCommand
關閉它,然后釋放資源。
public void Dispose()
{
if(this.Status != Closed) // check if it is not already closed
{
SendCloseCommand();
}
////other resources release
}
這將確保您的資源處置,即使您的類與using
語句一起using
,或者任何人手動調用Close
。
在發出Close Command之前,請記住檢查Worker
對象的狀態。
Microsoft有一些關於在實現IDisposable
的類上使用Close
方法的建議。 它是Dispose Pattern指南的一部分:
除了
Dispose()
之外, CONSIDER提供方法Close()
,如果close是該區域中的標准術語。這樣做時,將
Close
實現與Dispose
相同並考慮顯式實現IDisposable.Dispose
方法非常重要。
public class Stream : IDisposable {
IDisposable.Dispose(){
Close();
}
public void Close(){
Dispose(true);
GC.SuppressFinalize(this);
}
}
因此,微軟的建議是隱藏Dispose
並讓它調用Close
來進行實際的清理。 另外,請記住有關Dispose
多次調用的指南:
DO允許多次調用
Dispose(bool)
方法。 第一次調用后,該方法可能選擇不執行任何操作。
遵循這些指導原則可使您的代碼與.NET庫保持一致,並且您將避免混淆是否應關閉或處理您的類以進行適當的清理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.