web-dev-qa-db-ja.com

プライベートフィールドとプライベートプロパティの違い

プライベートフィールドの代わりにプライベートプロパティを使用することの違いは何ですか

private String MyValue { get; set; }

// instead of

private String _myValue;

public void DoSomething()
{
   MyValue = "Test";

   // Instead of

   _myValue = "Test";
}

パフォーマンスの問題はありますか?または単に命名規則?

36
Yoann. B

プライベートプロパティを使用すると、内部データを抽象化できるため、同じクラスであっても、内部表現への変更が実装の他の部分に影響を与える必要はありません。プライベートフィールドにはこの利点はありません。 C#3.0の自動プロパティでは、フィールドを直接実装する必要はほとんどありません(プライベートまたはパブリック)。

26
tvanfosson

プロパティ(プライベート、パブリックなど)から得られる大きなメリットは、設定値に対して計算値を生成できることです。例えば

class Person { 
  private DateTime _birthday;
  private int _age { get { return (DateTime.Now - _birthday).TotalYears; }
}

このパターンの利点は、変更を反映するために他のN個の値に対して1つの値のみを更新する必要があることです。これは、アクセシビリティに関係なく、プロパティに当てはまります。私有財産と非私有財産の特定の利点はありません(もちろん私有であることを除いて)

19
JaredPar

プロパティをプライベートにすることはめったにありません。不動産の私的提供は、完全を期すためにのみ提供されています。また、プロパティが単にフィールドの値を取得/設定している場合は、JITコンパイラによってインライン化される可能性が高いため、パフォーマンスの違いはありません。

11
Raminder

それ以外に、すでに回答されていること、パフォーマンス、セマンティクス、および完全性には、プライベートフィールドではなくプライベートプロパティについて私が見た有効なケースが1つあります。

public class Item
{
    private Item _parent;
    private List<Item> _children;

    public void Add(Item child)
    {
        if (child._parent != null)
        {
            throw new Exception("Child already has a parent");
        }
        _children.Add(child);
        child._parent=this;
    }
}

なんらかの理由でParentを公開したくないが、検証チェックも実行したいとします。親は、その子の1つに子として追加できる必要がありますか?

これを解決するには、これをプロパティにして、循環参照のチェックを実行します。

4
JoshBerke

プライベートアクセスを扱う場合、違いは非常に小さいです。はい、パフォーマンスへの影響があります(JITによって最適化される場合があります)。送信プロパティは、直接アドレスアクセスではなく、メソッド呼び出しを表します。

プロパティを使用する主な利点は、必要な外部署名を変更せずに実装を変更できることです。これらは非公開でアクセスされるため、実装への変更はローカルコードにのみ影響します。

プライベートメンバーを扱うとき、あなたのチームの慣習を除いて、私はプロパティから得られる利点を見ません。

0
tylermac

プロパティへのアクセスは、ゲッター/セッターを呼び出すため、(部分的に)遅くなります。利点は、データ検証を実行できることです。たとえば、保護するプロパティを変更した場合、継承者にフィルターをかけることができます。

0
Rowland Shaw