程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Effective C#原則30:選擇與CLS兼容的程序集(3)

Effective C#原則30:選擇與CLS兼容的程序集(3)

編輯:關於C語言

你可以在任何與CLS兼容的類中實現它。然而,如果你在與沒有標記與CLS兼容的程序集中定義了這個接口,那麼這個IFoo接口就並不是CLS兼容的接口。也就是說,一個接口只是滿足CLS規范是不夠的,還必須定義在一個CSL兼容的程序集中時才是CLS兼容的。原因是編譯器造成的,編譯器只在程序集標記為CLS兼容時才檢測CLS兼容類型。相似的,編譯器總是假設在CLS不兼容的程序集中定義的類型實際上都是CLS不兼容的。然而,這個接口的成員具有CLS兼容性標記。即使IFoo沒有標記為CLS兼容,你也可以在CLS兼容類中實現這個IFoo接口。這個類的客戶可以通過類的引來訪問DOStuff,而不是IFoo接口的引用。

考慮這個簡單的參數:

public interface IFoo2
{
 // Non-CLS compliant, Unsigned int
 void DOStuff( UInt32 arg1, string arg2 );
}

一個公開實現了IFoo2接口的類,與CLS是不兼容的。為了讓一個類即實現IFoo2接口,同時也是CLS兼容的,你必須使用清楚的接口定義:

public class MyClass: IFoo2
{
 // explicit interface implementation.
 // DOStuff() is not part of MyClass's public interface
 void IFoo2.DOStuff( UInt32 arg1, string arg2 )
 {
  // content elided.
 }
}

MyClass 有一個與CLS兼容的接口,希望訪問IFoo2 接口的客戶必須通過訪問與CLS不兼容的IFoo2接口指針。

兼容了嗎?不,還沒。創建一個CLS兼容類型要求所有的公共以及受保護接口都只包含CLS兼容類型。這就是說,某個類的基類也必須是CLS兼容的。所有實現的接口也必須是CLS兼容的。如果你實現了一個CLS不兼容的接口,你必須實現明確的接口定義,從而在公共接口上隱藏它。

CLS兼容性並沒有強迫你去使用最小的公共名稱來實現你的設計。它只是告訴你應該小心使用程序集上的公共的接口。以於任何公共的或者受保護的類,在構造函數中涉及的任何類型必須是CLS兼容的,這包含:

*基類

*從公共或者受保護的方法和屬性上返回的值

*公共及受保護的方法和索引器的參數

*運行時事件參數

*公共接口的申明和實現

編譯器會試圖強制兼容一個程序集。這會讓提供最小級別上的CLS兼容變得很簡單。再稍加小心,你就可以創建一個其它語言都可以使用的程序集了。編譯器的規范試圖確保不用犧牲你所喜歡的語言的結構就可以盡可能的與其它語言兼容。你只用在接口中提供可選的方案就行了。

CLS兼容性要求你花點時間站在其它語言上來考慮一下公共接口。你不必限制所有的代碼都與CLS兼容,只用避免接口中的不兼容結構就行了。通用語言的可操作性值得你花點時間。

返回教程目錄

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved