-1

私は自動車のプロパティに関する無数の記事を読みましたが、次の例のようなことをしない理由を思い付くことができません。私はここで何かが欠けていますか?つまり、この例で通常のプロパティを使用する必要がある理由はありますか?私は定期的にそれを行い、それはうまくいきます。

StackOverflowの別のスレッド(C#3.0追加ロジックを使用した自動プロパティ)では、「いいえ、自動的に実装されたプロパティには実装が宣言されていません。提供する拡張実装では、通常の財産。」

    class Foobar
{
    public string Description { get; set; }
    public bool Scary { get; private set; }

    public void Describe(int size)
    {
        if (size <= 3)
        {
            switch (size)
            {
                case 1:
                    Description = "Cute";
                    Scary = false;
                    break;
                case 2:
                    Description = "Interesting";
                    Scary = false;
                    break;
                case 3:
                    Description = "Interesting";
                    Scary = false;
                    break;
            }                
        }
        else if (size > 4 && size < 10)
        {
            Description = "I'm sweating!";
            Scary = true;
        }
        else
        {
            Description = "I'm outta here - every man for himself";
            Scary = true;
        }
    }
}
4

2 に答える 2

2

プロパティのget/setメソッドにコードを追加するのではなく、get/setプロパティを使用するクラスに完全に別個のメソッドを追加します。

誰かがsetメソッドを使用するのではなく、直接Descriptionまたは直接使用する場合、カスタムロジックは実行されません。例として、誰かが行うことを妨げるものは何もありません。これらのプロパティのメソッドをオーバーロードすると、誰かがそのようなかわいくて怖いオブジェクトを作成するのを防ぐことができます。ScaryDescribeobj.Describe(10); obj.Description = "Cute";set

あなたがリンクした質問の答えは完全に正しいです。自動実装されたプロパティのget/setメソッドに検証を追加することはできません。必要に応じて、get/setメソッドを明示的に定義する必要があります。

于 2012-11-21T18:36:22.930 に答える
1

投稿したコードは、自動的に実装されたプロパティを利用しており、問題ありません。

論理的には、自動プロパティは次のようになっていることを理解することが重要です。

private string _description;
public string Description 
{ 
    get { return _description; }
    set { _description = value; }
}

private bool _scary;
public bool Scary 
{ 
    get { return _scary; }
}

これを理解することは、 「提供したい拡張実装は通常のプロパティを使用する必要がある」理由を理解するために重要だと思います。

自動プロパティは、上記のものと論理的に同等である必要があります。言い換えれば、自動プロパティはそれが何であるかです。これは、上記のコードと同等の省略形です。

したがって、プロパティに追加または異なるロジックを含めたい場合は、自動プロパティを使用できません。

たとえば、クラスをリファクタリングして(「could」は「should」を意味しないことを忘れないでください)、Describeメソッドをすべてまとめて廃止し、すべてのロジックをプロパティにカプセル化できます。


class Foobar
{
    private int _size;

    public string Description 
    { 
        get 
        {    
            if (_size == 1)
            {
                return "Cute";
            }
            else if (_size < 4)
            {
                return "Interesting";
            }
            else if (_size < 10)
            {
                return "I'm sweating!";
            }
            else
            {
                return "I'm outta here - every man for himself";
            }
        }
    }

    public bool Scary 
    { 
        get
        {
            return _size > 3;
        }
    }

    public Foobar(int size) 
    {
        _size = size;
    }
}

ただし、これを行うと、単純なget / setよりも多くのロジックが必要になるため、自動プロパティを使用できません。

自動プロパティをいつ/どのように使用するかを学習しているだけの場合は、常に「通常の」プロパティを書き出すことから始めることをお勧めします。次に、バッキング変数を取得/設定するだけの場合は、自動プロパティを使用するようにリファクタリングできます。

于 2012-11-21T18:58:36.027 に答える