17

この単純な C# コードを使用して、csc hello.cs; ildasm /out=hello.txt hello.exe.

class Hello
{
    public static void Main()
    {
        System.Console.WriteLine("hi");
    }
}

これはildasmのILコードです。

.class private auto ansi beforefieldinit Hello
       extends [mscorlib]System.Object
{
  .method public hidebysig static void  Main() cil managed
  {
    .entrypoint
    // Code size       13 (0xd)
    .maxstack  8
    IL_0000:  nop
    IL_0001:  ldstr      "hi"
    IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
    IL_000b:  nop
    IL_000c:  ret
  } // end of method Hello::Main

  .method public hidebysig specialname rtspecialname 
          instance void  .ctor() cil managed
  {
    // Code size       7 (0x7)
    .maxstack  8
    IL_0000:  ldarg.0
    IL_0001:  call       instance void [mscorlib]System.Object::.ctor()
    IL_0006:  ret
  } // end of method Hello::.ctor

} // end of class Hello

.method public instance void .ctor()コードの用途は何ですか?何もしないようです。

4

5 に答える 5

19

これは、デフォルトのパラメーターなしのコンストラクターです。あなたは正しいです。それは何もしません (基本Object()コンストラクターに渡す以外に、それ自体は特別なことは何もしません)。

コンパイラは、他のコンストラクターが定義されていない場合、常に非静的クラスの既定のコンストラクターを作成します。その後、すべてのメンバー変数がデフォルトに初期化されます。これはあなたができるようです

new Hello();

エラーが発生することなく。

于 2011-08-29T20:30:48.567 に答える
5

これは、C#言語仕様のセクション10.11.4で説明されています

クラスにインスタンスコンストラクター宣言が含まれていない場合、デフォルトのインスタンスコンストラクターが自動的に提供されます。そのデフォルトのコンストラクターは、直接基本クラスのパラメーターなしのコンストラクターを呼び出すだけです。

ここHelloには定義されたコンストラクターがないため、コンパイラーは、ベース/オブジェクトバージョンを呼び出すだけのデフォルトの何もしないコンストラクターを挿入します

于 2011-08-29T20:37:04.973 に答える
2

コンストラクターを定義しないクラスは、暗黙的なパブリックの既定のコンストラクターを取得します。

public MyClass()
  :base()
{
}

これは、基本クラスにアクセス可能なパラメーターなしのコンストラクターがある場合にのみ機能します。

于 2011-08-29T20:32:33.007 に答える
0

class Hello は object を継承します。デフォルトで生成されたコンストラクターは、単に class のコンストラクターを呼び出しますobject

于 2011-08-29T20:32:38.420 に答える
0

クラス自体は静的でも抽象的でもないため、デフォルトのパラメーターなしのコンストラクターを公開する必要があると仕様が規定していると思います。このようにして、作成したライブラリまたは PE の他のユーザーは、クラスのコピーをインスタンス化できます。

.ctor がない場合は、プライベート .ctor があると解釈できると思います。一般的にかなり曖昧です。しかし、論理的には、その通りです。このインスタンスでは .ctor は必要ありません。

于 2011-08-29T20:33:59.437 に答える