1. ホーム
  2. c#

自動実装のゲッターとセッター vs. パブリックフィールド

2023-08-04 09:19:18

質問

C#のクラスでこれを行うサンプルコードをよく見かけます。

public class Point {
    public int x { get; set; }
    public int y { get; set; }
}

あるいは、古いコードでは、明示的なプライベートなバッキング値で、新しい自動実装のプロパティを使用せずに、同じことを行います。

public class Point {
    private int _x;
    private int _y;

    public int x {
        get { return _x; }
        set { _x = value; }
    }

    public int y {
        get { return _y; }
        set { _y = value; }
    }
}

私の質問はその理由です。上記のようにすることと、以下のようにこれらのメンバーをパブリックフィールドにするだけとでは、機能的に何か違いがあるのでしょうか?

public class Point {
    public int x;
    public int y;
}

はっきり言って、基礎となるデータの変換を行う必要がある場合、ゲッターとセッターの価値を理解しています。しかし、単に値を渡すだけのケースでは、不必要に冗長になるように思えます。

どのように解決するのですか?

私は (不必要に冗長であると思われることに) 同意する傾向がありますが、これは私たちのチームがまだ解決していない問題であるため、私たちのコーディング標準では、すべてのクラスに対して冗長なプロパティをまだ要求しています。

ジェフ アトウッド は数年前にこの件を扱いました。 彼が振り返って指摘した最も重要な点は、フィールドからプロパティに変更することは を破壊する変更であるということです。 それを消費するものはすべて、新しいクラス インターフェースで動作するように再コンパイルする必要があります。したがって、自分のコントロール外のものが自分のクラスを消費している場合、問題が発生する可能性があります。