LoginSignup
30
32

More than 5 years have passed since last update.

C# プロパティのSetアクセサを使わないという提案

Last updated at Posted at 2014-06-21

C#のプロパティって便利ですよね。

VisualStudioでpropまで打ってTab,Tabってやれば

public int MyProperty { get; set; }

まで自動で作ってくれるので楽なんですけど、このプロパティのsetアクセサを(Binding目的以外で)使うのをやめて、必要な場合はSetHoge(int value)みたいなメソッドにしませんかという提案。

以下理由です。

IDEで追いづらい

VisualStudioで「すべての参照の検索」から、setしてる箇所だけを抽出することができない。(実は方法ある?)

setアクセサを別メソッドにしておけば、そのメソッドに対する参照だけ抽出できるので
そのほうが管理しやすいと思う。

Bindingで更新されるものと区別がつかない

xaml系アプリに限った話になるけど、プロパティはBinding用のI/Fとしても使われるので、setアクセサがpublicになっていたときに、それがViewからバインド経由で更新するためなのか、コードで更新するためなのかがわからない。

setアクセサがメソッドになっていれば、それがBindingから更新されるものではないことが一目でわかる。

そもそもオブジェクトが不変でない

プロパティに外から値をsetするような設計は、そもそもあまり望ましくない。
理想的には、コンストラクタで値を渡した後はもう不変の状態にしておきたい。

不変なプロパティを↓のようにprivateなsetアクセサで表現することもあると思うが、

Person.cs
public string Name { get; private set; }

public Person(string name)
{
    this.Name = name;
}

不変だということを保証するなら、本当は↓のように書くほうが良いと思う(ちょっと冗長になるけど)。

Person.cs
private readonly string _name;

public string Name
{
    get
    {
        return _name;
    }
}

public Person(string name)
{
    this._name = name;
}

まとめ

  • プロパティはBindingで使用する場合のみsetアクセサを設ける
  • クラス外から値を更新したい場合はSetメソッドで表現する
  • 不変な値はreadonlyフィールドに保持し、getアクセサのみを設ける

というのはいかがでしょうか(弱気)

30
32
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
32