6

C# は初めてで、カプセル化は "データを保護する" 方法に過ぎないことを理解しています。しかし、私はまだ不明です。get および set アクセサーのポイントは、次のように、外部関数が何かを取得および設定できるようにする前に、これらのメソッド内にテストを追加して、パラメーターが特定の基準を満たしているかどうかを確認することであると考えました。

private string myName;
public string MyName;// this is a property, speical to c#, which sets the backing field.

private string myName = "mary";// the backing field.

public string MyName // this is a property, which sets/gets the backing field.
{
    get
    {
        return myName;
    }
    set
    {
        if (value != "Silly Woman"){ 
           myName = value;
        }

    } 
}

しかし、私は次のようなコードをc#で見てきました:

public string MyName { get; set; }

何も入れずに get と set を実行するのはなぜですか? それは、プライベート バッキング フィールドを public と宣言するのと同じではありませんか? 外部から取得して設定できるのであれば、直接それを実行しないのはなぜですか?

4

5 に答える 5

7

実際、次のように自動プロパティを作成します。

public string Name { get; set; }

フィールドに裏打ちされたプロパティを構築するのと同じです:

private string _name;
public string Name {
    get { return _name; }
    set { _name = value; }
}

これらのプロパティのポイントは、データを非表示にすることではありません。あなたが観察したように、彼らはこれをしません。代わりに、これらのプロパティは、フィールドを操作するだけでなく、他のことを行うことができます。

public string Name {
    get { return _name; }
    set { if (value == null) throw new Exception("GTFO!"); _name = value; }
}

もう 1 つのことは、プロパティをvirtualにすることができるということです。

public virtual string Name { get; set; }

オーバーライドされた場合、派生クラスで異なる結果と動作を提供できます。

于 2013-07-16T03:00:52.927 に答える
0

後でチェック/テストを追加する場合は、コードを変更する方が簡単だからです。特に、コードに多くの継承と多くのクラスがある場合、実装をパブリック変数からパブリック プロパティに変更するのは非常に困難です。

さらに、たとえばリフレクションを使用している場合は、プロパティ内の get および set にさまざまな属性を追加できます。プロパティの get と set は内部的に異なるメソッドです。public 変数 /field しかない場合、異なるアクセス方法に異なるプロパティを追加することはできません。

于 2013-07-16T02:58:47.260 に答える