150

C# では、

Class(Type param1, Type param2) : base(param1) 

クラスのコンストラクターが最初に実行され、次にスーパークラスのコンストラクターが呼び出されますか、それとも基本コンストラクターが最初に呼び出されますか?

4

8 に答える 8

194

順序は次のとおりです。

  • メンバー変数は、階層内のすべてのクラスのデフォルト値に初期化されます

次に、最も派生したクラスから始めます。

  • 変数初期化子は、最も派生した型に対して実行されます
  • コンストラクター チェーンは、どの基本クラス コンストラクターが呼び出されるかを解決します。
  • 基本クラスが初期化されます(これをすべて再帰します:)
  • Foo() : this(...)このクラスのチェーン内のコンストラクター本体が実行されます ( etcでチェーンされている場合、複数存在する可能性があることに注意してください)

Java では、変数初期化子が実行される前に基底クラスが初期化されることに注意してください。コードを移植したことがある場合、これは知っておくべき重要な違いです:)

興味のある方は詳細ページをご用意しております。

于 2009-12-10T17:53:29.697 に答える
61

最初に基本コンストラクターを呼び出します。また:base(param1)、コンストラクターの後に を置かないと、ベースの空のコンストラクターが呼び出されることに注意してください。

于 2009-12-10T17:43:26.297 に答える
17

ベースクラスのコンストラクターが最初に呼び出されます。

于 2009-12-10T17:43:56.413 に答える
1

[編集: 答えるのにかかった時間の中で、質問は完全に変わっていました].

答えは、最初にベースを呼び出すことです。

[以下の古い質問に対する元の回答]

コンストラクター呼び出しの「ベース」ビットをいつ実行するかを尋ねていますか?

その場合、クラスがこのコンストラクターを持つ別のクラスから派生している場合は、コンストラクター ベースへの呼び出しを「チェーン」します。

  public class CollisionBase
    {
        public CollisionBase(Body body, GameObject entity)
        {

        }
    }

    public class TerrainCollision : CollisionBase
    {
        public TerrainCollision(Body body, GameObject entity)
            : base(body, entity)
        {

        }
    }

この例では、TerrainCollisionから派生しCollisionBaseます。この方法でコンストラクターを連鎖させることにより、指定されたコンストラクターが、既定のコンストラクターではなく、指定されたパラメーターを使用して基底クラスで呼び出されることが保証されます (ベースにコンストラクターがある場合)。

于 2009-12-10T17:45:42.877 に答える
0

コンストラクター メカニズムは、アプリケーションがコンストラクター チェーンを使用できるようにするため、はるかに優れています。アプリケーションを拡張する場合は、継承によって最小限のコード変更を行うことができます。 ジョン・スキーツ 記事

于 2015-07-20T12:04:11.970 に答える
0

あなたの質問は少し不明確ですが、次の質問をするつもりだったと思います

XNA オブジェクトのベース コンストラクターを呼び出す場合と暗黙のデフォルト コンストラクターを使用する場合

これに対する答えは、シナリオと基になるオブジェクトの両方に大きく依存します。次のことを少し明確にしていただけますか

  • シナリオとは
  • の基本オブジェクトの型は何TerrainCollisionですか?

私の最良の答えは、基本クラスのコンストラクターのパラメーターと一致するパラメーターがある場合は、ほぼ確実にそれを呼び出す必要があるということです。

于 2009-12-10T17:44:19.900 に答える