3

私は C# が初めてで、MSDNのキーワードに関する記事virtualを読んでいました。サンプル コードでは、次のクラスを作成します。

public class Dimensions
{
    protected double x, y;

    public Dimensions()
    {
    }

    public Dimensions(double x, double y)
    {
        this.x = x;
        this.y = y;
    }

    public virtual double Area()
    {
        return x * y;
    }
}

最初のコンストラクター (パラメーターを必要としないコンストラクター) を追加したのはなぜですか? 2 つの double 値がxあり、yデフォルトで 0 であるため、このコンストラクターを追加しても問題はありません。しかし、私はこれを何度も見てきたので、常にそのようなコンストラクターを追加する背後に特別な理由があるかどうか疑問に思っていますか? 私は常にこれを行う必要がありますか?

4

4 に答える 4

10

デフォルトでは、クラスにはデフォルトのコンストラクターが含まれています。パラメーター化されたコンストラクターを追加すると、default providedコンストラクターは存在しなくなります。

したがって、パラメーターなしのコンストラクターが必要な場合は、パラメーター化されたコンストラクターを追加したら、手動で追加する必要があります。

だから、あなたの質問に完全に答えるために。いいえ、デフォルトのコンストラクターを追加する必要はありません。ただし、この場合、クラスの作成者は新しいオブジェクトを作成することを許可しておりDimensions、値はデフォルトで に設定されてい0ます。


シリアライゼーションに関するVladの回答への補足として:

シリアル化のみを目的としてパラメーターのないコンストラクターが必要な場合は、コンストラクターを(または) コンストラクターとしてマークできることを知っておくとよいでしょう。シリアライゼーション (または、その場合はデシリアライゼーション) はコンストラクターにアクセスできますが、ビジネス ロジックはアクセスできません。そうすれば、ビジネス ロジックに対するインターフェイスを「汚染」する必要がなくなります。privateprotectedprivate

于 2013-03-03T11:17:51.313 に答える
2

場合によっては、パラメーターのないコンストラクター(デフォルトのコンストラクター)が引き続き必要になります。これらのケースの1つは、シリアル化です。

ここで説明を読んでください

オブジェクトの逆シリアル化中に、オブジェクトの逆シリアル化を担当するクラスは、シリアル化されたクラスのインスタンスを作成し、入力するインスタンスを取得した後でのみ、シリアル化されたフィールドとプロパティの入力に進みます。

パラメータがない限り、必要に応じてコンストラクタをプライベートまたは内部にすることができます。

于 2013-03-03T11:21:22.693 に答える
2

いつもやるべき?絶対にありません。そのようなコンストラクターが有効になる状況がない場合は、パラメーターなしのコンストラクターを含めないでください。

したがって、設定できる適切なデフォルトがあり、それが有用と思われる場合は、先に進んで作成してください。そうでない場合は、そのままにして、クライアントに適切なパラメーターを提供するように強制します。

パラメーターなしのコンストラクターを必要とする外部要因がいくつかあることに注意してください。たとえば、多くの種類のシリアライゼーション。

于 2013-03-03T11:19:23.450 に答える
1

オブジェクトを最初に作成するときに、値が何であるかがわからないか、設定できない場合があります (例: シリアライゼーション)。オーバーロードされたコンストラクターを作成する場合、デフォルトのコンストラクターは暗黙的に作成されないため、自分で作成する必要があります。参照: クラスには常にデフォルトのコンストラクターを含める必要がありますか?

于 2013-03-03T11:19:51.137 に答える