27

重複の可能性:
C#コンストラクターの実行順序

class Foo
{
    public int abc;
    Foo()
    {
       abc = 3;
    }

}

class Bar : Foo
{
    Bar() : base()
    {
       abc = 2;
    }
}

上記の例では、Barのオブジェクトが作成されると、BarObject.abcの値はどうなりますか?基本コンストラクターが最初に呼び出されますか、それともBar()が実行され、/ then / base()コンストラクターが実行されますか?

4

6 に答える 6

46

2 になります。コンストラクタは、最初に基底クラスから最後に継承されたクラスの順に実行されます。

初期化子 (静的変数とインスタンス変数の両方) は反対方向に実行されることに注意してください。

完全なシーケンスはこちら: http://www.csharp411.com/c-object-initialization/

于 2010-01-07T15:33:06.823 に答える
4

最初の基本クラスコンストラクターが呼び出され、続いて派生クラスコンストラクターが呼び出されます。結果は2です。そのクラス変数のアクセシビリティを明示的に指定する必要があります。保護されていますか、プライベートですか、パブリックですか?

公開に変更したようですので、2になります。

このリンクは、コンストラクター、それらがどのように使用されるか、いつ呼び出されるか、および継承を使用するときのコンストラクター呼び出しの順序を理解するのにさらに役立ちます。

http://www.yoda.arachsys.com/csharp/constructors.html

また、実際にこれを自分で試してみることもできます。コードを練習して記述し、それを読むだけで、より多くのことを学ぶことができます。

Barを宣言し、その値を出力してみてください。いくつかのプロパティを使用します。

 class Foo
    {
        public int abc;
        public Foo()
        {
            abc = 3;
        }

        public int ABC
        {
            get { return abc; }
            set { abc = value; }
        }

    }

    class Bar : Foo
    {
        public Bar() : base()
        {
            abc = 2;
        }
    } 


    class Program
    {
        static void Main(string[] args)
        {
            Bar b = new Bar();
            Console.WriteLine(b.ABC);
            Console.ReadLine();

        }
    }

簡単なプリントアウトで、探している結果が得られます。出力は次のとおりです。

代替テキスト

あなたは私の愛だけではありませんnamespace:-)。ちなみに、自動プロパティを使用して、プロパティが単にpublic int ABC{get;set;}になるようにすることもできます。

于 2010-01-07T15:31:39.790 に答える
2

これがコンパイルされるように abc を保護すると仮定すると、2 になります。ただし、base()最初に呼び出されます。

このようなものについては、簡単なテスト アプリケーションを作成し、いくつかのブレークポイントを設定して答えを見つけてください。

于 2010-01-07T15:35:30.360 に答える
1

変数abcは3に設定され、次に2に変更されます(基本コンストラクターが最初に呼び出されます)。

于 2010-01-07T15:31:10.853 に答える
1

基本コンストラクターが最初に呼び出されますが、このコードはコンパイルされません。サブクラスからプライベート フィールドにアクセスすることはできません。サブクラスで使用するには、少なくともフィールドを保護する必要があります。

しかし、これを知っていても、あなたが試みている行動は驚くべきものであり、混乱を招きます。物事がどの順序で行われるかを尋ねなければならなかったという事実は、順序が忘れられたときにめちゃくちゃになることを意味します.

于 2010-01-07T15:32:48.633 に答える
1

基本コンストラクターが最初に呼び出され、abc の値は 2 になります。

于 2010-01-07T15:34:17.540 に答える