首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

.NET 遺忘錄(一):CLS 合規性——跨語言互操作的隱形契約

     編輯:關於.NET

Common Language Specification (CLS) 定義了 .NET 語言互操作的「最大公約數」。編寫程式庫若忽視 CLS,將導致 VB.NET、F#、IronPython 等語言無法正常呼叫你的公開 API。

組件級合規:一行屬性搞定

[assembly: CLSCompliant(true)] // AssemblyInfo.cs

編譯器將檢查所有 public/protected 型別與成員:

  • 型別名稱不區分大小寫衝突
  • 無不合規型別(uint, sbyte, 指標、無符號陣列)出現在公開簽名
  • 多載僅靠 out/ref 差異
  • 屬性/事件存取子一致性

實戰案例:uint 導致的合規性警告

public class Person {
    private uint _age; // uint 非 CLS 合規
    public uint Age { get { return _age; } } // 公開屬性暴露 uint
}

編譯警告:Type of 'Age' is not CLS-compliant。

內部實現可不合規:internal 保護邊界


class InternalHelper { // internal,非公開合約
    private uint _cacheSize; // 允許
    public uint CacheSize { get; set; } // 允許
}

編譯器**不檢查** internal/private 成員。合規邊界 = 組件可見性邊界。

替代方案:提供 CLS 合規包裝


public class Person {
    private uint _age;
    [CLSCompliant(false)]
    public uint Age { get { return _age; } } // 標記非合規

    public int AgeInt32 { get { return (int)_age; } } // 提供合規替代
}

取捨藝術:何時堅持合規

場景建議
公開 NuGet 套件、企業共享程式庫**強制合規**
內部專案、單一語言團隊可放寬,但建議核心域模型合規
高效能數值運算、互操作原生代碼核心用非合規型別,對外包裝合規介面

結語

CLS 合規非強制,但專業程式庫的基本禮儀。一行 [assembly: CLSCompliant(true)],為你的代碼贏得跨語言通用的通行證。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved