共用方式為


撰寫 CLS 相容的程式碼

Common Language Specification (CLS) 相容性一般是指已遵循 CLS 規則和限制的聲明。不過,這個概念還有更明確的含意,依據您是描述 CLS 相容的程式碼或 CLS 相容的開發工具 (例如編譯器) 而有不同。CLS 相容的工具可以協助您撰寫 CLS 相容的程式碼。

CLS 相容的程式碼

如果您希望程式碼能夠為 CLS 相容,您必須以一種能在下列地方以 CLS 相容的方式來公開功能:

  • 公用類別的定義。
  • 公用類別之公用成員的定義,以及衍生類別 (Derived Class) 可存取之成員 (family 存取) 的定義。
  • 公用類別之公用方法的參數和傳回型別,以及衍生類別可存取之方法的參數和傳回型別。

在私用類別的定義中、在公用類別之私用方法上的定義中,以及在區域變數中使用的功能不用遵循 CLS 規則。您也可以在實作類別的程式碼中使用您想要的任何語言功能,而且仍然具有 CLS 相容的元件。

您可以使用 CLSCompliantAttribute,將組件、模組、型別及成員標記為 CLS 相容或與 CLS 不相容。所有預期要 CLS 相容的組件都應依此標記。未標記為 CLS 相容的組件會被視為與 CLS 不相容。如果型別沒有套用任何 CLS 屬性,這個型別會假設與定義它的組件具有相同的 CLS 相容性。同理,如果成員沒有套用任何 CLS 屬性,這個成員會被視為與定義它的型別具有同樣的 CLS 相容性。如果程式包含的項目未標記為 CLS 相容,您就不能將這個程式標記為 CLS 相容。在這個主題結尾的範例說明 CLSCompliantAttribute 的使用方式。

即使有部分的組件、模組或型別與 CLS 不相容,只要能符合以下兩種情況,這些組件、模組及型別仍然可以是 CLS 相容的:

  • 如果項目被標記為 CLS 相容,則與 CLS 不相容的部分必須使用引數設定為 falseCLSCompliantAttribute 加以標記。
  • 對每一個與 CLS 不相容的成員,必須提供一個相當且 CLS 相容的替代項目。

如果您設計 CLS 相容的類別庫,您的程式庫保證會擁有與各種不同程式語言的互通性;因此,您的程式庫也會比與 CLS 不相容的版本擁有更廣泛的客戶基礎。

.NET Framework 提供一個 CLS 相容的類別庫。如需這個類別庫的詳細資訊,請參閱 .NET Framework 參考

CLS 相容的工具

以 Runtime 為目標的語言都已協議要支援 CLS 功能並且遵循導向編譯器的 CLS 規則。這些語言編譯器讓您能夠使用 CLS 資料型別和功能來建立元件,簡化了 CLS 相容性。各種編譯器和其他工具的 CLS 相容性等級描述如下:

  • CLS 相容的消費者工具

    消費者工具是能讓開發人員存取 CLS 相容之程式庫提供之所有功能的語言。使用這些語言的開發人員或許不能藉由建立新型別來擴充 CLS 相容的程式庫,但是他們能夠使用由相容的程式庫所定義的任何型別。當您希望存取 .NET Framework 類別庫,但不需要撰寫新物件供其他人使用時 (例如當您要在 ASP.NET 網頁上使用 Web Form,或建立 Windows Form 使用者介面時),這個相容性等級就會很有用處。

  • CLS 相容的擴充項 (Extender) 工具

    擴充項工具是可以讓開發人員使用及擴充 CLS 相容之程式庫中所定義型別的語言。開發人員可以使用現有的型別,也可以定義新的型別。擴充項工具必須遵循消費者工具所必須遵循的所有規則,再加上隨同 .NET Framework SDK 安裝的 Tool Developers Guide 目錄中 Common Language Infrastructure, Partition I 的規格中所描述的一些其他規則。

當您自行設計 CLS 相容的元件時,使用 CLS 相容的工具會很有幫助。在沒有這項支援的情況下撰寫 CLS 相容元件更為困難,因為您可能無法以其他方式存取您想要使用的所有 CLS 功能。

有些 CLS 相容的語言編譯器 (例如 C# 編譯器) 可以讓您指定是否希望程式碼 CLS 相容。這些編譯器會檢查 CLS 相容性,並且會在程式碼使用 CLS 所不支援的功能時通知您。C# 編譯器可以讓您將程式項目標記為 CLS 相容,這樣就會使 C# 編譯器在程式碼與 CLS 不相容的時候產生編譯時期錯誤。例如,下列 C# 程式碼將不會進行編譯。

using System;
// Assembly marked as compliant.
[assembly: CLSCompliantAttribute(true)]
// Class marked as compliant.
[CLSCompliantAttribute(true)]
public class MyCompliantClass {
   // ChangeValue exposes UInt32, which is not in CLS.
   // A compile-time error results.
   public void ChangeValue(UInt32 value){ }
   public static void Main( ) {
   int i = 2;
   Console.WriteLine(i);
   }
}

這個程式碼會產生下列錯誤。

error: CS3001: Argument type 'uint' is not CLS-compliant.

若要移除這項錯誤,您可以指示 ChangeValue 為不相容,如以下範例中所示。

using System;
// Assembly marked as compliant.
[assembly: CLSCompliantAttribute(true)]
// Class marked as compliant.
[CLSCompliantAttribute(true)]
public class MyCompliantClass {
   // Method marked as not compliant.
   [CLSCompliantAttribute(false)]
   public void ChangeValue(UInt32 value){ }
   public static void Main( ) {
   int i = 2;
   Console.WriteLine(i);
   }
}

這個程式碼將不會產生編譯錯誤。輸出為 2

如需指定程式碼 CLS 相容性的詳細資訊,請參閱您所使用之語言編譯器的文件。

請參閱

跨語言互通性 | 語言互通性概觀