Objectクラス
共通の基本クラス
C# でアプリケーションを開発するには、プログラミング言語 C# としての構文だけではなく、.NET Framework が提供する基礎機能の理解が重要になります。文字を出力したり、ウィンドウを生成したりするようなアプリケーションとしての機能は C# の機能ではなく、.NET Framework クラスライブラリを使用して行うことになります。
.NET Framework 内で動作するあらゆるオブジェクトは System.Object クラスを継承します。
[SerializableAttribute] [ClassInterfaceAttribute(ClassInterfaceType::AutoDual)] [ComVisibleAttribute(true)] public ref class Object
Object クラスの継承は暗黙的に行われ、全ての型は Object に変換できます。新しいクラスを作成するとき、基本クラスを指定しない場合は暗黙的に Object クラスを継承すると解釈されます。
class A { }
上記の A クラスの宣言は基本クラスを指定しないため、暗黙的に Object クラスを継承します。明示的に、以下のように書いても同様です。
class A : System.Object { }
全てのオブジェクトが Object クラスから派生しているため、文字列も、整数も、任意のクラスのオブジェクトも、すべて Object 型に暗黙的に変換できます。この性質を応用し、参照型の実体には興味がなく、単純に参照型を受け取りたい場合などに Object 型として受け渡しするといった方法が考えられます。
class MagicalGirl { } class Incubator { } class Test { public static void Main(string[] args) { System.Object obj; obj = new MagicalGirl(); System.Console.WriteLine(obj); obj = new Incubator(); System.Console.WriteLine(obj); } }
コード1の MagicalGirl クラスと Incubator クラスは継承する基本クラスを指定していませんが、この場合は暗黙的に Object クラスを継承します。Main() メソッドで、これらのクラスのオブジェクトを作成し、Object 型の obj 変数に代入しています。すべてのオブジェクトは Object クラスを継承しているため、暗黙の参照変換が行われます。
全てのオブジェクトの基本となる Object 型は C# の object キーワードを用いて表すことができます。object キーワードは System.Object の別名で、int キーワードや string キーワードと同じ、プログラミング言語に組み込まれている基本型として機能します。
class MagicalGirl : System.Object { } class Incubator : object { } class Test { public static void Main(string[] args) { object obj; obj = new MagicalGirl(); System.Console.WriteLine(obj); obj = new Incubator(); System.Console.WriteLine(obj); } }
コード2の実行結果はコード1と同じですが、Main() メソッド内の obj 変数の宣言に使用している型が System.Object ではなく object キーワードである点が異なります。object キーワードは System.Object の別名として機能するため、結果は System.Object と記述した場合と同じです。
また MagicalGirl クラスと Incubator クラスの宣言で、明示的に Object クラスを継承しています。このとき、MagicalGirl クラスの宣言では .NET Framework の System.Object クラスを指定し、Incubator クラスの宣言では C# の object キーワードを指定しています。どちらも System.Object クラスを指すので、やはり結果は同じです。