クラスの基本事項 (C# と Java の比較)
更新 : 2007 年 11 月
以下のセクションでは、C# と Java の修飾子を比較します。
アクセス修飾子
C# の修飾子と Java の修飾子にはわずかな違いがありますが、基本的に同じです。クラスの各メンバまたはクラス自体は、許可されるアクセスのスコープを定義するアクセス修飾子を使用して宣言できます。他のクラス内で宣言されていないクラスは、public 修飾子または internal 修飾子のみを指定できます。入れ子になったクラスは、他のクラス メンバと同様に、次の 5 つのアクセス修飾子を指定できます。
-
すべての項目からアクセスできます。
-
派生クラスからのみアクセスできます。
-
指定したクラス内でのみアクセスできます。
-
同じアセンブリ内でのみアクセスできます。
protected internal
現在のアセンブリまたは格納しているクラスから派生した型からのみアクセスできます。
public、protected、private の各修飾子
public 修飾子が設定されたメンバは、クラスの内部と外部のどこでも使用できるようになります。protected 修飾子の場合は、格納する側のクラスまたはそのクラスから派生したクラス内にアクセスが制限されます。また private 修飾子の場合は、格納する側の型の内部だけにアクセスが制限されます。C# の既定のアクセス修飾子は private ですが、Java では、格納しているパッケージの中からどこにでも既定でアクセスできます。
internal 修飾子
internal 項目には、現在のアセンブリ内でのみアクセスできます。.NET Framework のアセンブリは、Java で言えば、JAR ファイルに当たります。アセンブリは、他のプログラムを作成する元になるビルド ブロックを表します。
protected internal 修飾子
protected internal 項目には、現在のアセンブリ、または格納しているクラスから派生した型だけがアクセスできます。
sealed 修飾子
クラス宣言で sealed 修飾子が設定されたクラスは、抽象クラスとは対照的に継承できません。クラスを sealed とマークすると、そのクラスの機能を他のクラスがオーバーライドできなくなります。当然、シール クラスは抽象クラスにすることはできません。また、構造体は暗黙的にシールされるので、継承できません。sealed 修飾子は、Java でクラスを final キーワードでマークすることと同じです。
readonly 修飾子
C# で定数を定義する場合は、Java の final キーワードの代わりに const 修飾子または readonly 修飾子を使用します。C# のこれら 2 つの修飾子は、const 項目がコンパイル時に処理され、readonly フィールドの値は実行時に指定されるという点で区別されます。これは、readonly フィールドへの割り当てを宣言だけでなく、クラス コンストラクタでも行うことができることを意味します。たとえば、次のクラスでは、クラス コンストラクタで初期化される IntegerVariable という readonly 変数を宣言しています。
public class SampleClass
{
private readonly int intConstant;
public SampleClass () //constructor
{
// You are allowed to set the value of the readonly variable
// inside the constructor
intConstant = 5;
}
public int IntegerConstant
{
set
{
// You are not allowed to set the value of the readonly variable
// anywhere else but inside the constructor
// intConstant = value; // compile-time error
}
get
{
return intConstant;
}
}
}
class TestSampleClass
{
static void Main()
{
SampleClass obj= new SampleClass();
// You cannot perform this operation on a readonly field.
obj.IntegerConstant = 100;
System.Console.WriteLine("intConstant is {0}", obj.IntegerConstant); // 5
}
}
readonly 修飾子を静的フィールドに適用する場合、このフィールドは、クラスの静的コンストラクタで初期化する必要があります。