1.舉例 為了方便加深理解,我準備先講解一個例子來映襯出CLS的主要作用。 每個國家在成立之後肯定會於他國之間建立外交關係從而進行一些貿易往來,剛開始可能只會存在與一兩個國家達成了合作,所以只會與少數的國家進行貿易往來。在進行貿易往來前為了溝通順暢,國家之間交流的語言必須要一致,這個時候通常的方式是 ...
1.舉例
為了方便加深理解,我準備先講解一個例子來映襯出CLS的主要作用。
每個國家在成立之後肯定會於他國之間建立外交關係從而進行一些貿易往來,剛開始可能只會存在與一兩個國家達成了合作,所以只會與少數的國家進行貿易往來。在進行貿易往來前為了溝通順暢,國家之間交流的語言必須要一致,這個時候通常的方式是:A國家去學習B國家的語言,又或者B國家去學習A國家,從而實現語言溝通順暢。
隨著國家的不斷壯大,那麼能夠外交合作的國家會越來越多,如果還是按照上面的方式建立語言的溝通方式,這個時候就有一個問題:即如果外交國有N個,那麼就要學習N個國家的語言。雖然可以這麼做,但這並不是一種科學的方式。基於這種現象就誕生出了一種通用語言,這個通用語言從而打破了所有國家之間交流的屏障。當然,在我們現實生活中也存在著這種國際通用語言,那就是英語。
2.主要作用
在.Net平臺中同樣會出現上面例子中問題。假設你在.Net平臺下設計了一門語言叫N#,那麼在沒有一套通用語言規範的前提下,你可以去引用C#編寫的程式集從而實現交互嗎?答案顯然是不能。即使是你和C#一樣可以完美的在.Net框架下運行,但是它們之間沒有共通之處。
這個時候你可能會像上面的例子一樣,去學習C#語言從而實現一些共通之處,從而實現兩個不同語言項目間的引用。但是你要搞清楚,在.Net平臺下不會僅僅只有你們兩種編程語言存在,並且.Net的設計目標是實現一個開放的平臺,也意外著它會存在多種語言,我們不可能為了引用一個語言就跟這個語言建立一種獨立的溝通方式。
因此就需要一套規範和標準來實現各語言間的共通之處,即使是要引用或被引用N個不同的語言項目,只要大家就遵循這個規範,就能實現跨語言的程式集引用。那麼在.Net中的這個規範就叫做CLS(Common Language Specification,公共語言規範)
3.實現引用不代表公開
在我們有了CLS的語言規範後實現了不同語言項目之間的程式集引用,但在多個程式集之間引用的時候,並不意味者某個程式集必須將自己所有的內容提供給對方程式集,而僅僅是針對程式集中公開的(public)部分,而其中不公開的部分(private、internal、protected)是不會被對方獲取到的。所以在遵循CLS規範的同時也需要衡量下,那些需要提供給對方,那些不需要,然後你只針對對方需要的部分進行公開(public)。
4.具體的規範
上面已經講了CLS的主要作用和一些細節,但這些只是停留在概念上,下麵我舉幾個CLS當中實際的規範,以便加深理解。
4.1.命名約定
有些編程語言的不區分大小寫的,但是CLS規範中就必須要求區分大小寫。下麵我們通過一個代碼示例來證明這一規範。
圖中首先要說明的就是在命名空間上標識的特性:[assembly: CLSCompliant(true)],這個特性的作用是便於我們在編譯前檢查程式集中的代碼是否符合CLS的規範。從上圖結果來看顯然是不符合的,因為CLS是區分大小寫的,它會將Person和person作為同一個類,但是上面的C#代碼並沒進行大小寫區分。
另外還要註意的一點,就是特性[assembly: CLSCompliant(true)],檢查出不符合CLS的規範時,只會給出警告,並不會標識為錯誤。你可以忽略,但是這代表這個程式集不能由其他語言編寫的程式集所引用。
4.2.構造函數
CLS對構造函數的一個規範是:一個類如果有繼承關係,那麼子類必須要調用父類的構造函數。下麵我們通過一個代碼示例來證明這一規範。
Doctor類中並沒有調用其父類Person的構造函數,所以是不符合CLS規範。這個規範和上面的規範有不同之處,因為C#本身已經包含了和CLS相同的規範,那麼這個規範在C#中就作為強制的了,直接提示出了錯誤而非警告。
關於CLS具體的規範還有很多,本文不在這裡一一展開,本文旨在對CLS(公共語言規範)有一個初步的理解,如果需要詳細的深入,可以瀏覽.Net官方地址:
https://docs.microsoft.com/zh-cn/dotnet/standard/language-independence
知識改變命運