ECMA-335(CLI)标准 读书笔记(第一部:概念和架构 第7章)
上一篇:ECMA-335(CLI)標準 讀書筆記(第一部:概念和架構 1~6章)
?
7.?????? CLS
7.1?? 介紹
CLS是一套傾向于提高語言互操作性的一套規則。我們應當遵循這些規則。11章將詳盡得描述和總結。CLS的一致性是為CLI實現而生的類型的一個特征。這種類型除了遵循CLS規則外還必須遵從于CLI標準。這些額外的規則只應用于集合間可見而不是集合里定義的類型,也應用于集合外可訪問的成員,也就是那些有public,family(不含sealed類型),family-or-assembly(不含sealed類型)可訪問性的類型。
【注意:構成CLS兼容代碼的庫在這兒被作為framework使用。為CLI產生代碼的編譯器能夠用這些庫,但不能產生或擴展這些庫代碼。這些編譯器被作為consumers使用。能產生并擴展frameworks的編譯器被作為extenders使用。在每個CLS規則的描述中,額外的文本信息用于幫助讀者理解規則在每種情況下的意思。】
7.2?? CLS遵循性的觀點
CLS是一套用于產生集合的規則。因為CLS被設計為支持庫和用于編寫它們的高級語言的互操作性,所以通常需要從高級源碼和工具的角度考慮CLS規則,譬如用于產生集合的編譯器。因為這個原因,CLS規則的描述中加了些標注信息來幫助讀者理解規則在幾種不同的工具和用戶的類中的意義。這就是那些:framework, consumer, extender。
7.2.1????????? CLS framework
構成CLS兼容庫的代碼在這兒被作為framework使用。Frameworks被設計用于廣泛的編程語言和工具,包括CLS consumer和extender語言。遵循CLS規則能使庫的作者確保庫能被更廣泛的工具類使用。下面就是應當遵循的規則:
·???????? 避免使用常用的名字作為編程語言中的關鍵字
·???????? 不要期望framework的用戶能寫嵌套類型
·???????? 假定來自不同接口的同名方法的實現是獨立的
·???????? 不要指望值類型的初始化能被自動賦予指定的初始化值
·???????? 假設用戶能夠理解使用泛型和方法,但不要要求他們去定義新的泛型及方法,重載已存在的泛型及方法或者部分處理已創建的泛型。
CLS規則的標準文本見7.2章的最后部分。
7.2.2????????? CLS consumer
CLS consumer 是一種被設計為允許訪問CLS兼容框架所有特征的語言或工具,但并不需要去產生它們。下面是CLS consumer被期望做到的一些事情:
·???????? 支持調用任何CLS兼容的方法或委托。
·???????? 具有一種調用名字在語言中是關鍵字的方法的機制。
·???????? 支持調用獨特的方法,這些方法的類型有相同的名字和簽名,但是實現不同的接口。
·???????? 創建任何一個CLS兼容類型的實例。
·???????? 讀取和修改任何CLS兼容的字段。
·???????? 訪問嵌套類型。
·???????? 訪問任何CLS兼容的屬性。除了調用getter和setter屬性的方法外不需要任何特殊支持。
·???????? 訪問任何CLS兼容的事件。除了調用為事件而定義的方法外不需要任何特殊支持。
·???????? 有一種導入、實例化和使用泛型和泛型方法的機制。
【注:Consumers應該考慮支持:
·???????? 為了匹配語言定義的規則,對泛型方法做類型推斷;
·???????? 在公共的父類型中構造語法來明晰模糊的部分】
下面列出了CLS consumer工具不需要支持的:
·???????? 創建新類型或接口。
·???????? 除了static literal fields,在字段和參數上初始化metadata(見第二部分)。注意,consumers能選擇初始化metadata,但也能在任何除了static literal fields地方安全地無視metadata。
7.2.3????????? CLS extender
CLS extender是一個被設計為允許編程人員使用和擴展CLS兼容框架的語言或工具。CLS extender支持一個行為被CLS consumer支持的超集(例如一切適用于CLS consumer的也適用于CLS extender)。除了支持consumer外,還需要能夠:
·???????? 定義新的CLS兼容類型來擴展任何CLS兼容的基類,不包括sealed的。
·???????? 具有一種調用名字在語言中是關鍵字的方法的機制
·???????? 提供獨立實現受類型支持的所有接口的所有方法。也就是說,對于extender而言,只要求一段單一的代碼來實現具有相同名字和簽名的所有接口方法是不夠的。
·???????? 實現任何CLS兼容接口
·???????? 替換metadata上所有CLS兼容的定制屬性
·???????? 定義新的CLS兼容(非泛型)類型來擴展任何(非sealed)CLS兼容的基本類型。有效地基本類型包括正常的(非泛型)類型和完全構造的泛型。
【注:Extenders應該考慮支持:
·???????? 為了匹配語言定義的規則對泛型方法做類型推斷;
·???????? 在公共的父類型中構造語法來明晰模糊的部分】
Extenders不需要支持下面:
·???????? 定義新的CLS兼容接口
·???????? 定義嵌套類型
·???????? 定義泛型和方法
·???????? 重載存在的虛泛型方法
CLS被設計得既足夠大以富有表現力也足夠小而使得所有的語言都能夠很好得適應它。
CLS規則48:如果在同一類型中聲明的兩個或兩個以上的CLS兼容方法具有同樣的名字,對于類型實例的一個特定集合,它們有相同的參數和返回類型,那么那些類型實例中所有的這些方法在語義上就應該是相同的。
【注:CLS(consumer):可能選擇方法中的任何一個
CLS(entender):同consumer一樣
CLS(framework):不應該暴露違反本規則的方法】
【注:為了避免沖突,盡管這個版本中增刪了一些規則,CLS規則仍遵循了舊版本標準中的舊編號方式。所以,這部分的第一個規則就是規則48】
7.3?? CLS兼容
當這些規則被詳細得介紹的時候,它們以一種通用的格式被描述。例如,看下面的第一個規則。第一段指出了規則本身。然后下面就跟著從上面提到的3個不同的角度對規則的一些連帶描述。
CLS定義了語言互操作規則,僅僅用于外部可見的內容。語言互操作性的CLS單元是集合——也就是說,在單個集合內部,對使用的編程技術沒有限制。這樣,CLS規則僅用于那些在限定集合上外部可見(見8.5.3章)并有public、family或family-or-assembly訪問權限(見8.5.3.2章)的部分。
CLS規則1:CLS規則僅用于類型中限定集合外部可訪問或可見的那些部分。
【注:CLS(consumer):無影響
CLS(extender):當編譯時檢查CLS兼容性時,一定要將規則應用于集合外部將要被導出的信息。
CLS(framework):CLS規則不用于集合內部的實現。這種情況下類型仍然是CLS兼容的:所有的公共訪問部分(那些對在另一個集合中代碼執行有效的類、接口、方法、字段、屬性和事件)由簽名的CLS兼容類型組成或者對非CLS兼容做了明確標記】
任何構造都被排除在CLS之外,因為它不可能迅速地驗證代碼。這就允許所有的CLS兼容的語言翻譯程序可以選擇產生可驗證的代碼。
7.3.1????????? 把項標記為CLS兼容
CLS詳細說明了怎樣去標記集合的外部可見部分以說明它們是否遵循CLS要求。(實現者被阻止將擴展標記作為本CLS兼容的標準。)這用定制屬性機制來解決(見9.7章和第二部分)。類System.CLSCompilantAttribute(見第四部分)指出了哪些類型和類型成員是CLS兼容的。它也能被附在集合上來為所有的集合包含的頂級類型指定缺省的兼容級別。
System.CLSCompilantAttribute的構造帶了一個Boolean參數指出是否該項與它所關聯項是否為CLS兼容的。這允許任何項(集合、類型或類型成員)被明確地標記為CLS兼容或者不兼容。
決定CLS兼容性的規則是:
·???????? 當集合不帶有明確的System.CLSCompilantAttribute時,應該缺省帶System.CLSCompilantAttribute(false)。
·???????? 缺省的,一個類型繼承其封閉類型(對嵌套類型)的CLS兼容屬性或者獲得依附于集合(對于頂級類型)的兼容性級別。一個類型能被標記為CLS兼容或者通過附加System.CLSCompilantAttribute屬性標記為不兼容。
·???????? 缺省的,其它成員(方法、字段、屬性和事件)繼承它們類型的CLS兼容性。它們也能通過附加System.CLSCompilantAttribute(false)屬性來標記為不兼容。
CLS 規則2:非CLS兼容類型的成員不應當被標記為CLS兼容。
【注:CLS(consumer):能夠忽略任何使用上面規則的CLS不兼容的成員。
CLS(extender):應該鼓勵正確地標記新創建的集合和公開的導出類型和成員。大力鼓勵編譯時強制執行CLS規則。
CLS(framework):應該正確地標記所有的公開的導出成員來標明其CLS兼容性。這里指定的規則可以用來減少所需的標記數目(例如,如果所有的類型和成員都是兼容的,或者僅有少數例外的需要被標記,那就標記整個集合)】
?
版權聲明作者:Cubean
出 處:http://www.cnblogs.com/cubean/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且 在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。 ?
?
?
轉載于:https://www.cnblogs.com/cubean/archive/2010/03/13/1685159.html
總結
以上是生活随笔為你收集整理的ECMA-335(CLI)标准 读书笔记(第一部:概念和架构 第7章)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DriveInfo类取得计算机的磁盘信息
- 下一篇: 博士生与民工的笑话