2

このクラスがあるとします:

class FooBar
{
    public FooBar() : this(0x666f6f, 0x626172)
    {
    }

    public FooBar(int foo, int bar)
    {
        ...
    }
 ...
}

私がこれをした場合:

FooBar foobar = new FooBar();

パラメータ化されていないコンストラクタが最初に実行され、次にパラメータ化されたコンストラクタが実行されますか、それともその逆ですか?

4

4 に答える 4

4

MSDNには、次のような例がありbaseます。

public class Manager : Employee
{
    public Manager(int annualSalary)
        : base(annualSalary)
    {
        //Add further instructions here.
    }
}

そして次のように述べています。

この例では、コンストラクターのブロックが実行される前に、基底クラスのコンストラクターが呼び出されます。

それにもかかわらず、ここに私のテストがあります:

class Program
{
    public Program() : this(0)
    {
        Console.WriteLine("first");
    }

    public Program(int i)
    {
        Console.WriteLine("second");
    }

    static void Main(string[] args)
    {
        Program p = new Program();
    }
}

版画

second
first

したがって、パラメーター化されたコンストラクターは、明示的に呼び出されたコンストラクターの前に実行されます。

于 2012-06-02T20:40:30.993 に答える
3

コントロールは、最初に既定のコンストラクターに到達します。そこからパラメーター化されたコンストラクターを呼び出すと、既定のコンストラクターでのステートメントの実行が停止し、制御がパラメーター化されたコンストラクターに移動します。パラメーター化されたコンストラクターでのステートメントの実行が完了すると、コントロールは既定のコンストラクターに戻ります。

デフォルトのコンストラクターにブレークポイントを配置することで確認できます。

于 2012-06-02T20:37:17.470 に答える
1

それが「定義された動作」として文書化されているかどうかはわかりませんが、TestClass(int)最初に実行してからTestClass().

于 2012-06-02T20:38:55.173 に答える