C# プロパティとフィールド、classとstruct

class Hoge
{
  public Hoge2 Hoge2;
}

struct Hoge2
{
  public int X;
}

var hoge = new Hoge();

hoge.Hoge2.X = 1;

これは出来る
Hoge2のところをプロパティに変えてみる。

class Hoge
{
  public Hoge2 Hoge2{ get; set; }
}

var hoge = new Hoge();

hoge.Hoge2.X = 1;

これはコンパイルエラーになる。getはreturnするからだ。
structは値渡しされるから戻ってくるのは値のコピー。そこに代入しても意味がない。

var hoge = new Hoge();

Hoge2 hoge2 = hoge.Hoge2
hoge2.X = 1;

これはコンパイル出来るがやはり値のセットは出来ていない。classで構成されたオブジェクトに慣れているとまっとうな文に見えてしまうから余計にたちが悪い。

普通はフィールドをreadonlyにすればいい。getterのみのプロパティにするだけではダメだ。クラス内からセットできてしまう。readonlyフィールドをgetterのみのプロパティで公開するならいい。

俺はパフォーマンス上の理由でstructを選びたいのだが、structをプロパティにすると中身がセットできないのでフィールドにしないといけない。まあ

Hoge2 hoge2 = hoge.Hoge2
hoge2.X = 1;
hoge.Hoge2 = hoge2;

こうすれば更新も出来るんだけど遅い。structにする意味がない。何よりわかりにくい。

そしてフィールドはインターフェースのメンバに出来ない。恐ろしい制限だ。生半可な気持ちで使えるようなものじゃないよstruct怖いよstruct。