撰寫符合 CLS 標準的程式碼
更新:2007 年 11 月
Common Language Specification (CLS) 符合性一般是指已遵循 CLS 規則和限制的聲明。不過,這個概念還有更明確的含意,依據您是描述符合 CLS 標準的程式碼或符合 CLS 標準的開發工具 (例如編譯器) 而有不同。符合 CLS 標準的工具可以協助您撰寫符合 CLS 標準的程式碼。
符合 CLS 標準的程式碼
如果您希望程式碼能夠為符合 CLS 標準,您必須以一種能在下列地方以符合 CLS 標準的方式來公開功能:
公用類別的定義。
公用類別之公用成員的定義,以及衍生類別 (Derived Class) 可存取之成員 (family 存取) 的定義。
公用類別之公用方法的參數和傳回型別,以及衍生類別可存取之方法的參數和傳回型別。
在私用類別的定義中、在公用類別之私用方法上的定義中,以及在區域變數中使用的功能不用遵循 CLS 規則。您也可以在實作類別的程式碼中使用您想要的任何語言功能,而且仍然具有符合 CLS 標準的元件。
注意事項: |
---|
不規則陣列 (Jagged Array),也就是陣列的陣列,是符合 CLS 標準的。在 .NET Framework 1.0 版中,C# 編譯器將這些錯誤地報告成不符合 CLS 標準。 |
您可以使用 CLSCompliantAttribute,將組件、模組、型別及成員標記為符合 CLS 標準或不符合 CLS 標準。所有預期要符合 CLS 標準的組件都應依此標記。未標記為符合 CLS 標準的組件會被視為不符合 CLS 標準。如果型別沒有套用任何 CLS 屬性,這個型別會假設與定義它的組件具有相同的 CLS 符合性。同理,如果成員沒有套用任何 CLS 屬性,這個成員會被視為與定義它的型別具有同樣的 CLS 符合性。如果程式包含的項目未標記為符合 CLS 標準,您就不能將這個程式標記為符合 CLS 標準。在這個主題結尾的範例說明 CLSCompliantAttribute 的使用方式。
即使有部分的組件、模組或型別不符合 CLS 標準,只要能符合以下兩種情況,這些組件、模組及型別仍然可以是符合 CLS 標準的:
如果項目被標記為符合 CLS 標準,則不符合 CLS 標準的部分必須使用引數設定為 false 的 CLSCompliantAttribute 加以標記。
對每一個不符合 CLS 標準的成員,必須提供一個相當且符合 CLS 標準的替代項目。
如果您設計符合 CLS 標準的類別庫,您的程式庫保證會擁有與各種不同程式語言的互通性;因此,您的程式庫也會比不符合 CLS 標準的版本擁有更廣泛的客戶基礎。
.NET Framework 提供一個符合 CLS 標準的類別庫。如需此類別庫的詳細資訊,請參閱 .NET Framework 類別庫參考。
符合 CLS 標準的工具
以執行階段為目標的語言都已協議要支援 CLS 功能並且遵循導向編譯器的 CLS 規則。這些語言編譯器讓您能夠使用 CLS 資料型別和功能來建立元件,簡化了 CLS 符合性。各種編譯器和其他工具的 CLS 符合性等級描述如下:
符合 CLS 標準的消費者工具
消費者工具是能讓開發人員存取符合 CLS 標準之程式庫提供之所有功能的語言。使用這些語言的開發人員或許不能藉由建立新型別來擴充符合 CLS 標準的程式庫,但是他們能夠使用由相容的程式庫所定義的任何型別。當您希望存取 .NET Framework 類別庫,但不需要撰寫新物件供其他人使用時 (例如當您要在 ASP.NET Web 網頁上使用 Web Form,或建立 Windows Form 使用者介面時),這個相容性等級就會很有用處。
符合 CLS 標準的擴充項 (Extender) 工具
擴充項工具是可以讓開發人員使用及擴充符合 CLS 標準之程式庫中所定義型別的語言。開發人員可以使用現有的型別,也可以定義新的型別。擴充項工具必須遵循消費者工具所必須遵循的所有規則,以及 Common Language Infrastructure Partition I 的規格中所描述的一些其他規則 (架構,可從 Microsoft Developer Network ( 網站取得)。
當您自行設計符合 CLS 標準的元件時,使用符合 CLS 標準的工具會很有幫助。在沒有這項支援的情況下撰寫符合 CLS 標準元件更為困難,因為您可能無法以其他方式存取您想要使用的所有 CLS 功能。
有些符合 CLS 標準的語言編譯器 (例如 C# 或 Visual Basic 編譯器) 可以讓您指定是否希望程式碼符合 CLS 標準。這些編譯器會檢查 CLS 符合性,並且會在程式碼使用 CLS 所不支援的功能時通知您。C# 和 Visual Basic 編譯器可以讓您將程式項目標記為符合 CLS 標準,這樣就會使編譯器在程式碼不符合 CLS 標準的時候產生編譯時期錯誤。例如,下列程式碼會產生編譯器警告。
<Assembly: CLSCompliant(True)>
<CLSCompliant(True)> Public Class MyCompliantClass
Public Sub ChangeValue(value As UInt32)
End Sub
Public Shared Sub Main()
Dim i As Integer = 2
Console.WriteLine(i)
End Sub
End Class
using System;
// Assembly marked as compliant.
[assembly: CLSCompliant(true)]
// Class marked as compliant.
[CLSCompliant(true)]
public class MyCompliantClass {
// ChangeValue exposes UInt32, which is not in CLS.
// A compile-time warning results.
public void ChangeValue(UInt32 value){ }
public static void Main( ) {
int i = 2;
Console.WriteLine(i);
}
}
這個程式碼會產生下列 C# 警告:
warning CS3001: Argument type 'uint' is not CLS-compliant
或下列 Visual Basic 警告:
warning BC40028: Type of parameter 'value' is not CLS-compliant.
若要移除這項警告,您可以指出 ChangeValue 不符合標準,如以下範例中所示。
' Assembly marked as compliant.
<Assembly: CLSCompliant(True)>
' Class marked as compliant.
<CLSCompliant(True)> Public Class MyCompliantClass
' Method marked as not compliant.
<CLSCompliant(False)> Public Sub ChangeValue(value As UInt32)
End Sub
Public Shared Sub Main()
Dim i As Integer = 2
Console.WriteLine(i)
End Sub
End Class
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 符合性的詳細資訊,請參閱您所使用之語言編譯器的文件。