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