簡體   English   中英

為什么RabbitMQ的SimpleRpcServer使用Dispose()的顯式接口實現?

[英]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類中存在此實現。 困惑與您是否需要同時調用CloseDispose或同時調用兩者有關,而實際上它們都執行相同的操作。

實現它的類的一個示例是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM