automatic property って必要?

Automatic property は、結構話題を呼んでいるようで、いたるところで意見を見かけます。ぱっと検索しただけで id:dotnetmemo:20061115:1163601672 や id:akiramei:20070311:p1、Automatic Properties(C#3) などです。
Automatic property は実装クラスで次のような構文で単純なプロパティの生成を助けるものです。

public int AutoProperty
{
  get;
  set;
}

Automatic property は、かならず get および set が存在しなくてはなりません。Automatic property を用いる利点は、

  • 記述量が少ない
  • 誤ってフィールドを直接更新してしまうことがない

といったところなのでしょう。interface におけるプロパティの宣言と記述方法がかなり似ていますが、コンテキストが違えば意味が異なる構文というのは珍しいものではないので、それが問題視されることはマズないと思われます。
個人的に、フィールドを隠蔽する機能は非常に有用だと思いますが、希望的には automatic field であってほしかった、構文的には

public int PropertyWithAutomaticField
{
  get { return valuefield; }
  set { valuefield = value; }
}

みたいなかんじで、C# のプロパティ定義文では value というコンテキストセンシブキーワードが存在するので、そこに valuefield というコンテキストセンシティブキーワードを追加する。このキーワードが含まれたプロパティでは、対応するプロパティと同じ型のプライベートなフィールドに自動的に展開される、というところ。この方式であれば記述量には大差がないものの、

  • automatic property と同じ実装にする場合、code snip で十分対応できる
  • 単純な参照および代入以外の実装を追加することができる
  • バックストアフィールドを隠蔽するという効果は失われない

という特徴があります。どないでしょうか?

公開されたフィールドは存在が悪であるということ

ついでに類似ネタ。上記の auto property が活躍できるような場面では、私は仕事以外では好きで public なフィールドを多用しています。しかし、実は .NET の世界において、フィールドは private または internal までであるべきで、protected 以上の可視性をもつものは、存在そのものが問題を抱えており、それが外部ライブラリなどから表面化したときには「なんでフィールドなんだ!」と叫びたくなること間違いなし。*1

*1:そんなことがわかってるのに多用してるのはごめんなさいとしか言いようがない

続きを読む