web-dev-qa-db-ja.com

C#base()コンストラクターの順序

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

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

}

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

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

21
Xenoprimate

コンストラクターは、最初に基本クラスから最後に継承クラスの順に実行されます。

イニシャライザー(静的変数とインスタンス変数の両方)は反対方向に実行されることに注意してください。

完全なシーケンスはここにあります: http://www.csharp411.com/c-object-initialization/

39
Paolo

最初の基本クラスコンストラクターが呼び出され、続いて派生クラスコンストラクターが呼び出されます。結果は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();

        }
    }

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

alt text

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

4
JonH

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

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

2
bradjive

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

1
kemiller2002

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

しかし、これを知っていても、あなたが試みている行動は驚くべきものであるため混乱を招きます。順番を尋ねなければならなかったという事実は、注文を忘れると混乱することを意味します。

1
Chris Pitman

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

1
Aaron M