CLS 準拠コードの記述
更新 : 2007 年 11 月
一般に、共通言語仕様 (CLS: Common Language Specification) に準拠するとは、CLS の規則および制限事項に従う必要があるということです。ただし、CLS 準拠コードについて述べているのか、コンパイラなどの CLS 準拠の開発ツールについて述べているのかに応じて、この概念にはより具体的な意味が伴います。CLS 準拠ツールを使用すると、CLS 準拠コードを簡単に記述できます。
CLS 準拠コード
CLS に準拠したコードを作成するには、次に示す場所で、CLS に準拠した方法で機能を公開する必要があります。
パブリック クラスの定義。
パブリック クラスのパブリック メンバの定義、および派生クラスからアクセスできる (family アクセス) メンバの定義。
パブリック クラスのパブリック メソッドのパラメータおよび戻り値の型、派生クラスからアクセスできるメソッドのパラメータおよび戻り値の型。
プライベート クラスの定義、パブリック クラスのプライベート メソッドの定義、およびローカル変数で使用する機能は、CLS の規則に従う必要はありません。クラスを実装するコードでは任意の言語機能も使用でき、その場合でもコンポーネントを CLS 準拠にすることができます。
メモ : |
---|
ジャグ配列、つまり配列の配列は、CLS 準拠です。.NET Framework Version 1.0 では、C# コンパイラが誤ってそれらが CLS 準拠ではないと報告します。 |
アセンブリ、モジュール、型、およびメンバに CLS 準拠または非 CLS 準拠のマークを付けるには、CLSCompliantAttribute を使用します。CLS 準拠にするすべてのアセンブリには、そのことを示すマークを付ける必要があります。CLS 準拠のマークが付けられていないアセンブリは、非 CLS 準拠と見なされます。型に CLS 属性が適用されていない場合、その型の CLS 準拠は、その型が定義されているアセンブリと同一であると見なされます。同様に、メンバに CLS 属性が適用されていない場合も、そのメンバの CLS 準拠は、そのメンバを定義している型と同一であると見なされます。プログラム要素の外側の要素に CLS 準拠のマークが付いていない場合は、そのプログラム要素に CLS 準拠のマークを付けることはできません。CLSCompliantAttribute の使用例を、このトピックの最後に示します。
アセンブリ、モジュール、型は、それらのアセンブリ、モジュール、型の一部が CLS に準拠していない場合でも、次の 2 つの条件が満たされていれば CLS 準拠になります。
要素に CLS 準拠のマークが付いている場合は、非 CLS 準拠の部分に対して、引数を false に設定した CLSCompliantAttribute でマークする必要があります。
非 CLS 準拠の各メンバについては、CLS 準拠の同等の代替メンバを用意する必要があります。
CLS 準拠のクラス ライブラリをデザインすると、作成したライブラリでは幅広いプログラミング言語間の相互運用性が保証されます。したがって、そのライブラリは非 CLS 準拠のライブラリよりも、さまざまなユーザーに対応できることになります。
.NET Framework は、CLS 準拠のクラス ライブラリを提供しています。このクラス ライブラリの使用方法の詳細については、「.NET Framework クラス ライブラリ リファレンス」を参照してください。
CLS 準拠ツール
ランタイムに対応する言語は、CLS 機能をサポートし、コンパイラに対する CLS 規則に従うことになっています。これらの言語のコンパイラを使用すると、コンポーネントの作成で CLS のデータ型や機能を利用できるため、コンポーネントを簡単に CLS 準拠にすることができます。コンパイラおよびその他のツールにおける CLS 準拠のレベルについて次に説明します。
CLS 準拠のコンシューマ ツール
コンシューマ ツールとは、CLS 準拠のライブラリで提供されるすべての機能にアクセスできる言語のことです。これらの言語を使用する開発者は、新しい型を作成することによって CLS 準拠ライブラリを拡張することはできませんが、準拠ライブラリで定義されているすべての型を使用できます。このレベルの準拠は、ASP.NET ページで Web フォームを使用している場合や、Windows フォーム ユーザー インターフェイスを作成している場合などのように、.NET Framework クラス ライブラリにアクセスする必要はあるが、ほかの開発者が使用できる新しいオブジェクトを作成する必要がない場合に便利です。
CLS 準拠の拡張ツール
拡張ツールとは、CLS 準拠ライブラリで定義されている型を使用することも拡張することもできる言語のことです。開発者は、既存の型を使用したり、新しい型を定義したりできます。拡張ツールは、コンシューマ ツールが従う必要のあるすべての規則に従う必要があります。さらに、Microsoft Developer Network の Web サイトから入手できる「共通言語基盤」の仕様「Partition I - Architecture」で説明されている追加規則にも従う必要があります。
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 準拠にすることを指定する方法については、使用する言語コンパイラのドキュメントを参照してください。