[英]Why does RabbitMQ's SimpleRpcServer use an explicit interface implementation for Dispose()?
類RabbitMQ.Client.MessagePatterns.SimpleRpcServer使用顯式接口實現實現IDisposable。 實現是:
void IDisposable.Dispose()
{
Close();
}
這意味着為了在這樣的對象上調用Dispose()
,我首先必須將其強制轉換為IDisposable。 為什么以這種方式聲明Dispose方法? 我應該麻煩在SimpleRpcServer對象上調用Dispose()嗎? 我可能會忘記它,而只是調用Close()
,我只是在問,因為FxCop給了我一個警告,而且我認為以前沒有看到過顯式的接口實現。
某些.NET類中存在此實現。 困惑與您是否需要同時調用Close
, Dispose
或同時調用兩者有關,而實際上它們都執行相同的操作。
實現它的類的一個示例是RegistryKey
。 在.NET 3.5及 IDisposable
,它顯式實現了IDisposable
接口。 這鼓勵您在using中使用它或調用Close
方法。
在.NET 4.x及更高版本中 , IDisposable
接口是隱式實現的。
我相信Stream
是以類似的方式實現的。
從2000年10月的討論中可以看出,.NET Framework 1.0相對較晚IDisposable
,尤其是以下摘錄:
首先,我們正在討論形式化已在框架中使用的設計模式。 我們所有的資源類都已經支持稱為Dispose()的方法。 這是一個公共方法,您可以隨時調用它,以釋放對象所包含的資源。 想想它有點像c ++ delete運算符,但實際上並沒有釋放內存,它只是運行析構函數。 我們正在考慮使它成為一個接口,以幫助整理設計模式並促進某些語言支持,如下所述。
我相信(*)這就是為什么許多.NET 1.0類公開Close
方法並僅顯式實現IDisposable
。 而且我認為這被認為是一個錯誤,這就是為什么在更高版本的.NET中,更常見的是隱式實現IDisposable
。 例如,將公共Dispose
方法添加到.NET 2.0中的Stream
類。
(*)我的猜測,我沒有任何內在知識。
如果該框架以多種語言提供,而Dispose
可能沒有任何意義,則可以保留一個常用動詞。
或者,它可以做,因為Dispose
,如果還有一個可能沒有多大意義Open
方法,因為Close
是一種常見的反對動詞Open
。
例如,ADO DbConnection
類都可以這樣做:
connection.Open();
conncetion.Close();
或者,可能是IDisposable
是在產品已經發貨之后實現的,並且具有現有的Close
方法並保持向后兼容性Dispose
被顯式實現隱藏, Close
然后調用該顯式實現:
例如
// version 1
public class Thing
{
public void Close() { ... }
}
// version 2
public class Thing : IDisposable
{
public void Close() { ... }
void IDisposable.Dispose() { Close(); }
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.