プライベートフィールドとプライベートプロパティの違い
-
03-07-2019 - |
質問
プライベートフィールドの代わりにプライベートプロパティを使用することの違いは何ですか
private String MyValue { get; set; }
// instead of
private String _myValue;
public void DoSomething()
{
MyValue = "Test";
// Instead of
_myValue = "Test";
}
パフォーマンスの問題はありますか?または単なる命名規則?
解決
プライベートプロパティを使用すると、内部データを抽象化できるため、内部表現を変更しても、同じクラスであっても実装の他の部分に影響を与える必要はありません。プライベートフィールドにはこの利点はありません。 C#3.0の自動プロパティでは、プライベートフィールドまたはパブリックフィールドを直接実装する必要はほとんどありません。
他のヒント
プロパティ(プライベート、パブリック、...)から得られる大きな利点は、設定値に対して計算値を生成できることです。例
class Person {
private DateTime _birthday;
private int _age { get { return (DateTime.Now - _birthday).TotalYears; }
}
このパターンの利点は、変更を反映するために他のN個の値に対して1つの値のみを更新する必要があることです。これは、アクセシビリティに関係なくプロパティに当てはまります。プライベートプロパティと非プライベートプロパティの特定の利点はありません(もちろんプライベートである以外)
プロパティをプライベートにすることはめったにありません。プロパティがプライベートであるという規定は、完全を期すためにのみ提供されています。プロパティが単にフィールドの値を取得/設定している場合、JITコンパイラーによってインライン化される可能性が高いため、パフォーマンスの違いはありません。
それ以外に、すでに回答されているもの、パフォーマンス、シマンティクス、および完成度には、プライベートフィールドではなくプライベートプロパティで見た有効なケースが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つに追加できるようにする必要がありますか?
これを解決するには、これをプロパティにして、循環参照のチェックを実行します。
ゲッター/セッターを呼び出すため、プロパティへのアクセスは(わずかに)遅くなります。利点は、データ検証を実行できることです。たとえば、保護するプロパティを変更した場合、継承者にフィルターダウンできます。
プライベートアクセスを扱う場合、違いはごくわずかです。はい、パフォーマンスヒットがあります(JITによって最適化される可能性があります)。送信プロパティは、直接アドレスアクセスではなく、メソッド呼び出しを表します。
プロパティを使用する主な利点は、必要な外部署名を変更せずに実装を変更できることです。これらはプライベートにアクセスされるため、実装に対する変更はローカルコードにのみ影響します。
プライベートメンバーを扱う場合、チームの規約を除いて、プロパティから得られる利点はありません。