14

私は C# を学んでおり、いくつかのオープン ソース プロジェクトをレビューして、適切に記述されたコードを確認したいと考えていました。sourceforge で Todomoo というプロジェクトを見つけましたが、私を困惑させている部分があります。

public class Category {

    // Note properties
    private int id = 0;
    private string name = "";
    private Color colour = Color.Gray;

    /// <summary>
    /// Create a new category.
    /// </summary>
    public Category() { }

    /// <summary>
    /// Load a category from the database.
    /// </summary>
    /// <param name="Id">ID of the category</param>
    public Category(int id) : base() {
        Load(id);
    }

ここではbase()、コンストラクターの 1 つで使用していますが、クラスは派生クラスではありません。では、それは正確には何のためですか?

そして、なぜ構文base()がそのようであり、好きではないのですか:

    public Category(int id) {
        base();
        Load(id);
    }
4

6 に答える 6

17

しかし、クラスは派生クラスではありません

クラスは派生クラスです。暗黙的に から継承しSystem.Objectます。ただし、誰もbase()コンストラクタ forを呼び出す理由は明確ではありませんSystem.Object。これも暗黙的に行われます。

構文に関する限り、私の推測では、C# は Java の基本コンストラクターの呼び出しではなく、C++ 初期化子リストに近い構文を採用したと思います。

于 2012-08-08T14:46:34.550 に答える
14

C# のすべてのクラスは、C#のオブジェクトのSystem.Object参照から派生したクラスです。

于 2012-08-08T14:45:45.050 に答える
3

最初の質問に答えるために、すべてのユーザー定義クラスは、少なくとも 1 つの他のクラス (オブジェクト) から継承します。つまり、既定のコンストラクターを親コンストラクターとして定義することは、ほぼ常に有効です (それは、オブジェクトが、目に見える既定のコンストラクターを持たない他のものからより直接的に継承する場合だけではありません)。ただし、この場合は冗長です。基本クラスのデフォルトのコンストラクターが存在し、子からアクセスできる場合は、ユーザーがそのように言わなくても呼び出されます。

第 2 に、メソッドのオーバーライドとは異なり、基本クラス コンストラクターの機能を拡張するかどうか、および拡張する場所を選択することはできません。基本クラスのコンストラクターを呼び出して、親 (子でアクセスできる場合とできない場合があります) のデータ メンバーを初期化する必要があります。存在)。したがって、基本クラスのコンストラクターを好きな場所で呼び出せるようにする代わりに、この特定の子コンストラクターが使用されたときに呼び出したいコンストラクターを定義するように強制し、ランタイムがいつどこで処理するかを決定します。

于 2012-08-08T14:50:06.520 に答える
2

言語がこれを制限しているため、コンストラクターコードのどこかでコンストラクターを呼び出すことはできません。中間言語に関しては、コンストラクターは単なる別のメソッド呼び出しです。

于 2012-08-08T14:47:36.343 に答える
2

他の人が指摘したように、すべてのクラスはSystem.Object.

あなたの特定の例でbase()は、のデフォルトのコンストラクターを呼び出しますSystem.Object。が指定されていなくても、基本クラスのデフォルトのコンストラクターが常に呼び出されるため、これは実際には意味base()がありません。

たとえば、次のコード

public class Foo
{
    public Foo()
    {
        Console.WriteLine("Foo");
    }
}

public class Foo2 : Foo
{
    public Foo2()
    {
        Console.WriteLine("Foo2");
    }
}

public class Program
{
    private static void Main(string[] args)
    {
        Foo2 d = new Foo2();

        Console.ReadKey();
    }
}

版画

フー

ふー2

于 2012-08-08T14:52:46.840 に答える
1

カテゴリコンストラクターが実行する前にこれを構築するexternコンストラクターは、base();コンストラクターであり、何かを返しthis = new base()、エラーが発生するため、何も起こりません。

于 2012-08-08T14:47:28.433 に答える