通用語言規范(CLS)并不是虛擬對象系統(VOS)真正的一部分,它是特殊的。CLS定義了VOS中的一個類型子集,也定義了必須符合CLS的常規用法。
那么,對此有什么迷惑呢?如果一個類庫遵守CLS規則,其它編程語言同樣也遵守CLS規則,那么其它編程語言的客戶也可以使用類庫。CLS是關于語言的交互可操作性(interoperability)。因此,常規用法必須僅遵循外部可訪問項目 (externally visible items)如方法、屬性和事件等等。
我所描述的優點是你可以做以下工作。用C#寫一個組件,在VB中派生它,因加在VB中的功能是如此之強大,在C#中再次從VB類派生它。只要所有的外部可訪問項遵守CLS規則,這樣是可行的。
我在這本書中出示的代碼不關心CLS協定。但在構建你的類庫時要注意到CLS協定。
這個清單不完整。它僅包含一些很重要的項目。我不指出出現在本書中每一種類型的CLS協定,所以有個好主意:當你尋找CLS協定時,至少應該瀏覽該表,以了解哪種功能有效。不要擔心你不熟悉這張表中的每一個含義,在這本書中你會學到它們。
通能語言規范中的類型和功能
·bool ·char ·byte ·short ·int ·long ·float ·double ·string ·object(所有對象之母)
Arrays(數組)
數組的維數必須是已知的(>=1),而且最小下標數必須為0。
元素類型必須是一個CLS類型。
類型(Types)
可以被抽象或隱藏。
零或更多的接口可以被實現。不同的接口允許擁有具有相同名字和簽名的方法。
一個類型可以準確地從一個類型派生。允許成員被覆蓋和被隱藏。
可以有零或更多的成員,它們是域成員、方法、事件或者類型。
類型可以擁有零或更多個構造函數。
一種類型的可訪問性可以是公共的或者對NGWS組件來說是局部的;但是,只有公共成員可以認為是類型接口的一部分。
所有的值型必須從系統值型繼承。異常是一個枚舉——它必須從系統枚舉(System Enum)繼承。
類型成員
類型成員允許隱藏或者覆蓋另一種類型中的其它成員。
參數和返回值的類型都必須是 CLS 協定類型。
構造函數、方法和屬性可以被重載。
一個類型可以有抽象成員,但僅當類型不被封裝時。
方法
一種方法可以是靜態、虛擬或者實例。
虛擬和實例方法可以是抽象的,或者是一個實現。靜態方法必須總擁有一個實現。
虛擬方法可能是最后的(或者不是)。
域成員
可以是靜態或者是非靜態。
靜態域成員可以被描述或只初始化。
屬性
當獲取和設置方法而不是使用屬性語法時,屬性可以公開。
獲取的返回類型和設置方法的第一個參數必須是相同的CLS類型——屬性的類型。
屬性名字必須不同,不同的屬性類型用于區分是不充分的。
由于使用方法實現屬性訪問,如果 PropertyName 是同一個類中定義的一個屬性,你不能實現命名為 get_PropertyName 和 set_PropertyName 的方法。
屬性可以被索引。
屬性訪問必須遵循這種命名格式:get_ProName,set_PropName。
枚舉
強調類型必須是byte、short、int 或long。
每一個成員是一個枚舉類型的靜態描述域成員
一個枚舉不能實現任何接口。
你允許給多個域成員設定相同的值。
一個枚舉必須繼承系統枚舉(隱含在C#中)
異常
可以被引發和被捕獲。
自定義異常必須繼承系統異常。
接口
可需要實現其它接口。
一個接口可以定義屬性、事件和虛擬方法。實現取決于派生類。
事件
要么都進行增加方法和取消方法,要么都不進行。每一種方法采用一個參數,它是從系統代表元(System Delegate)派生下來的一個類。
自定義屬性
可以僅使用下列類型:Type(類型),char, char, bool, byte, short, int, long, float, double, enum (一種CLS 類型), and object.
代表元(Delegates)
可以被創建和被激活
標識符(Identifiers)
一個標識符的第一個字母必須來自一限制集。
通過大小寫在單一范圍內,不可能唯一地區別兩個或更多個標識符(大小寫不敏感)。
新聞熱點
疑難解答
圖片精選