2012-07-10 56 views
1

MSDN:System.Type爲什麼許多基類庫類具有顯式接口實現成員?

與上面的鏈接一樣,C#中的許多BCL類都將Explicit Interface Implementations作爲類成員。

我明白,當基本接口的成員之間存在名稱衝突時,我們必須使用顯式接口實現。但是,爲什麼我們必須在上述情況下使用顯式接口實現?與哪個接口有名稱衝突?

+2

你的標題抱怨說只有少數BCL類使用明確的接口實現,但你的問題主體是說很多BCL類都有它。這是什麼? – Oded 2012-07-10 21:03:24

+0

Type類是特殊的。提到這些是因爲它們對COM來說很重要。 _Type和_MemberInfo接口是[ComVisible]並且對於自定義CLR託管非常重要。在COM中隱藏方法實現是正常的。 AppDomain是另一個例子。 – 2012-07-10 21:56:22

回答

2

接口的顯式實現用於隱藏實例屬性/方法,除非調用代碼明確要求接口。

這是在下列情況下有效:

  • 類筆者認爲,一個接口的實現僅在極少數情況下使用,並應在默認情況下的可用性的緣故被隱藏(這顯然是類型爲類,因爲顯式接口實現是COM特定的)
  • 一個類實現了兩個或多個具有公共方法/屬性簽名的接口,但因接口而需要提供不同的實現,因爲接口有隱含但不同的行爲合約d方法簽名(類型類也有一個例子;大概是_MemberInfo.GetIDsOfNames和_Type.GetIDsOfNames的實現共享相同的簽名,但根據是否將類型實例投射到_MemberInfo接口而不是_Type接口)做了不同的事情。
  • 已使用(儘管不鼓勵)有一個類實現IDisposable,以便它的一個實例可以在使用塊的中使用,但鼓勵調用者使用更具體的域特定方法來「處置」類直接調用方法。請參閱http://blogs.msdn.com/b/kimhamil/archive/2008/03/15/the-often-non-difference-between-close-and-dispose.aspx
  • API開發人員可以在需要公開的類時使用它們實現的接口,該接口的實現只應在其程序集中使用。在這種情況下,接口將聲明爲內部關鍵字,並且它們的面向公共類將明確實現接口。最終的結果是隻有程序集中的代碼才能將類的實例轉換爲內部接口並訪問其實現,而程序集外部的調用程序則不能。

這些是想到的用例;我確定還有其他人沒有列出。

+0

謝謝你的解釋。 – LaysomeSmith 2012-07-11 16:30:44

相關問題