WisdomSoft - for your serial experiences.

Objectクラス

クラス宣言で基本クラスを指定しなかった場合、暗黙的に System.Object クラスを継承します。従って、新しく作成した型も含め、あらゆる型は System.Object クラスから派生しています。全てのオブジェクトは安全に System.Object 型に変換できるため、汎用型として応用できます。

共通の基本クラス

C# でアプリケーションを開発するには、プログラミング言語 C# としての構文だけではなく、.NET Framework が提供する基礎機能の理解が重要になります。文字を出力したり、ウィンドウを生成したりするようなアプリケーションとしての機能は C# の機能ではなく、.NET Framework クラスライブラリを使用して行うことになります。

.NET Framework 内で動作するあらゆるオブジェクトは System.Object クラスを継承します。

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 型として受け渡しするといった方法が考えられます。

コード1
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 実行結果

コード1の MagicalGirl クラスと Incubator クラスは継承する基本クラスを指定していませんが、この場合は暗黙的に Object クラスを継承します。Main() メソッドで、これらのクラスのオブジェクトを作成し、Object 型の obj 変数に代入しています。すべてのオブジェクトは Object クラスを継承しているため、暗黙の参照変換が行われます。

全てのオブジェクトの基本となる Object 型は C# の object キーワードを用いて表すことができます。object キーワードは System.Object の別名で、int キーワードや string キーワードと同じ、プログラミング言語に組み込まれている基本型として機能します。

コード2
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 実行結果

コード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 クラスを指すので、やはり結果は同じです。