程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> .NET,你忘記了麼(一)—— 遵從CLS

.NET,你忘記了麼(一)—— 遵從CLS

編輯:關於.NET

首先,讓我們來簡單地看下什麼叫做CLS。

鑒於個人的英文水平,我還是先給出 CLS的英文解釋,然後我再翻譯:

The CLS is a specification that defines the rules to support language integration. This is done in such a way, that programs written in any language (.NET compliant) can interoperate with one another. This also can take full advantage of inheritance, polymorphism, exceptions, and other features.

CLS定義了支持語言繼承的規范,他使我們所寫的程序可以於任何一門.NET 所兼容的語言交互,這使我們也可以充分利用繼承,多態,異常以及其他一些特點的優勢。

其實簡化了說,CLS就是定義了個門語言的子集,從而去保證語言的互操作性。

因此,為了語言之間的互操作,我們應該使我們的程序遵從CLS。

我們看一下 系統的層次,系統下應該是程序集,程序集下就是類(或結構體等)。那麼我們為了保證語 言的互操作性,就應該保證程序集對外的部分都遵從CLS。

這點很容易保證:

當我們新建一個程序集的時候,有一個文件叫做:AssemblyInfo.cs:

[assembly: AssemblyTitle("ClassLibrary1")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("微軟中國")]
[assembly: AssemblyProduct("ClassLibrary1")]
[assembly: AssemblyCopyright("Copyright © 微軟中國 2009")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// 將 ComVisible 設置為 false 使此程序集中的類型
// 對 COM 組件不可見。如果需要從 COM 訪問此程序集中的類型,
// 則將該類型上的 ComVisible 屬性設置為 true。
[assembly: ComVisible(false)]

// 如果此項目向 COM 公開,則下列 GUID 用於類型庫的 ID
[assembly: Guid("694543e8-4c7f-4952-9e98-7282ecff1c15")]

// 程序集的版本信息由下面四個值組成:
//
//   主版本
//   次版本 
//   內部版本號
//   修訂號
//
// 可以指定所有這些值,也可以使用“內部版本號”和“修訂號” 的默認值,
// 方法是按如下所示使用“*”:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

毫無疑問,這裡記錄的都是當前程序集的信息,那麼我們只需要在裡面加上一行代碼:

[assembly:System.CLSCompliant(true)]

這樣程序就保證了整個程序集滿足CLS規范。

當我們寫一段不滿足CLS的程序時:

namespace ClassLibrary1
{
   public class People
   {
     private string name;
     private uint age;  //uint不滿足CLS
     public uint Age
     {
       get
       {
         return age;
       }
     }
     public People(string name)
     {
       this.name = name;
     }
   }
}

當我們生成程序集的時候,報出了這樣的警告:

當然,我再對這個做一些附加的解釋,希望不是畫蛇添足:

我們都知道,一個程序集存在一些對外的接口,其他的程序集只是與這些對外的接口進行 交互,也就是說只要對外的接口滿足CLS,這個程序集就可以進行與其他語言的互操作了:

看一個例子,當我們把上述的class People設置為默認的訪問修飾符internal時:

class People
{
   private string name;
   private uint age;  //uint不滿足CLS
   public uint Age
   {
     get
     {
       return age;
     }
   }
   public People(string name)
   {
     this.name = name;
   }
}

這個時候,當我生成程序集的時候,並不會報CLS不兼容的錯誤:

因此,我不想再去說哪些類需要滿足CLS。我們只需要記住,如果你寫的某個類,或者變 量,方法,在程序集可以訪問到,那麼這個類,方法,變量就需要滿足CLS。

當然,有這樣一種情況,就是說使用了不滿足CLS的方法,變量等會極大提高整個程序的 可讀性,那麼我們就該為這個方法,或者變量等實現一個與其等義的方法等,於是,如果訪 問該程序集的是同一語言,那麼便訪問該方法,否則便訪問替代方法。

另外,有一種能力叫做取捨。我們不可能做出一個十全十美的項目,人力不允許,物力不 允許,精力也不允許,因此,我們必須要放棄一些東西。當我們這個項目基本不太可能與其 他語言進行交互時,那麼我就沒有必要將精力去集中在項目程序集是否滿足於CLS上。

當然,如果我們有時間,那麼抽出些時間去搞定語言的互操作,還是利大於弊的!

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