1

私はC#を研究していて、オーバーロードされたコンストラクター、それがどのように機能するか、そしてチェーン呼び出しのようにそれらを使用するポイントを理解しようとしていますか?必要なすべてのパラメーターを持つコンストラクターが1つだけではないのはなぜですか?以下に、作業中のタスクのヘルプコードをいくつか示します。このすべてのコンストラクターの要点を理解するには、いくつかのヘルプが必要です。いくつかの助けを正確に!ありがとう!

    public class Email
{
    //private email
    private string m_personal;
    //work mail
    private string m_work;

    public Email()
    {
    }

    public Email(string workMail) : this(workMail, string.Empty)
    {
    }

    public Email(string workMail, string personalMail)
    {
        m_work = workMail;
        m_personal = personalMail;
    }

    public string Personal
    {
        //private mail
        get { return m_personal; }

        set { m_personal = value; }
    }

    public string Work
    {
        get { return m_work; }

        set { m_work = value; }
    }

    public string GetToStringItemsHeadings
    {
        get { return string.Format("{0,-20} {1, -20}", "Office Email", "Private Email"); }
    }

    public override string ToString()
    {
        string strOut = string.Format("{0,-20} {1, -20}", m_work, m_personal);
        return strOut;
    }


}
4

5 に答える 5

3

必要なすべてのパラメーターを備えたコンストラクターを 1 つだけ持たないのはなぜですか?

クラスのユーザーが一部のパラメーターのみに関心がある場合はどうなるでしょうか? あなたの例を使用すると、誰かが個人的な電子メールを持っていない場合はどうなりますか? 彼らは合格するべきですか、nullそれともstring.Empty?この種の型レベルの知識は、型自体で処理するのが最適です。

余分なコンストラクターを仕事用の電子メールのみで公開することにより、本質的にクラスの消費者に「個人的な電子メールを持っていませんか? 心配しないでください。私が処理します」と伝えていることになります。

その上、定義を連鎖させることは、コードの冗長性を避けるのに自然に役立ちます。

于 2012-04-22T12:36:24.983 に答える
2

これは、についてではありませんConstructors。すべての種類のオーバーロードされた関数は、ライブラリの使用を簡素化します。クラスをコーディングするとき、すべての複雑さをブラック ボックスにカプセル化します。これは、いくつかの既知のbest Practices. 良い例は.NET、簡単に使用できるライブラリです (オーバーロードされた関数/コンストラクターを思い出してください)。

これは正しいか間違っているかではありません。オーバーロードされた関数を使用して使用法を簡単にし、必要のないときに null パラメーターを渡す必要がないようにします。

次に、削減するパラメーターが少ない次の関数によってネストされたほとんどのパラメーターを持つ関数を呼び出しますRedundancy。関数のすべてのバージョンで同じコードのコピー/貼り付けを避けることを意味します。

このパターンは広く受け入れられ、使用されているため、次世代の では、.NETこの冗長なバージョンを何らかの方法で隠し、ほとんどのパラメーターを使用して関数をコーディングするだけだと思います。

于 2012-04-22T12:41:08.707 に答える
1

ポイントは、これを回避するのに役立つため、コードの繰り返しを避けることです。

public Email(string workMail)
{
    m_work = workMail;
    m_personal = string.Empty;
}

public Email(string workMail, string personalMail)
{
    m_work = workMail;
    m_personal = personalMail;
}

コンストラクターは、フィールドを割り当てるだけでなく、それ以上のことができることを考慮してください。

使い方?試して、デバッグして、学ぶことができます。よくわかりませんが、最初にオーバーロードされたものを呼び出し、次にコンストラクターのコードを呼び出すと思います。あなたのシナリオでは、Email(string workMail) を呼び出すと、最初の Email(string workMail, string personalMail) が呼び出されます。

于 2012-04-22T12:33:09.803 に答える
1

2 番目のコンストラクターは、主に便宜上の目的で提供されていると言えます。個人のメール アドレスがない場合にクラスを簡単に使用できるようにするためです。クラスのユーザーは、作業アドレスを指定するだけでよく、クラス自体が、そのフィールドに適切なデフォルト値を設定することにより、存在しない個人アドレスの処理を処理します。そのパラメーターが欠落している場合、クラスのユーザーは、欠落している個人メール アドレスに対して string.Empty を埋める責任を負います。

コンストラクターは、コードの重複を避けるために、別のコンストラクターへの呼び出しとして実装されます。のように書くこともできます。

public Email(string workMail)
{
    m_work = workMail;
    m_personal = string.Empty;
}

しかし、2 パラメーターのコンストラクターを呼び出す既存の実装は、「同じことを繰り返さない」という原則に従っているため、よりクリーンなソリューションです。

于 2012-04-22T12:40:10.253 に答える