今回ですでにPart IIIとなるデブサミ スクリプトシリーズです。今日は自動実装 プロパティです。
C# 3.0 のデザイン最終段階で追加されたこの新しい構文は、デブサミでも触れましたが、v1 の頃からの Feedback の一つです。予想したよりも反響が大きく多くのお客さんに喜んでいただけたこと、また何でこんな事ができないんだという嬉しい Feedback もいただいています。C# のデザイン哲学、keep it simple! Simpleな事はエレガントであり理解しやすい、と同時に機能を付け足すのは簡単でも取り除くのは不可能だからです。このような言語のデザインの裏話を書いても楽しいのですが、本題のほうに戻ります。
C# 2.0 のコード
public class Product
{
private int productID;
public int ProductID
{
get { return productID; }
set { productID = value; }
}
…
…
}
C# 3.0 を使って書き換えると。
public class Product
{
public int ProductID { get; set; }
…
…
}
違いとしては、productIDのfieldとget/setのbodyがセミコロンに置き換わっています。
いつものようにここで、サンプルを修正してもいいのですが、今日はちょっとアカデミックにグラマーを見てみましょう。C# 3.0 の言語仕様によると、
property-declaration:
attributesopt property-modifiersopt type member-name { accessor-declarations }
…
ここで重要なのはaccessor-declarations でグラマーは
accessor-declarations:
get-accessor-declaration set-accessor-declarationopt
set-accessor-declaration get-accessor-declarationopt
get-accessor-declaration:
attributesopt accessor-modifieropt get accessor-body
set-accessor-declaration:
attributesopt accessor-modifieropt set accessor-body
accessor-modifier:
protected
internal
private
protected internal
internal protected
accessor-body:
block
;
じつは、グラマーはC# 2.0 から修正はまったくありません。これは、あるセッションで話した互換性の問題と深く関連していて、このように言語仕様の隙間を見つけて、Semanticの修正のみ(Parser には手を入れない)で新たな機能を付け加えることは多くあります。
では、デモコードに戻り、いつもの様にdefault.aspx.csを開いてpublic class Product を以下のコードに書き換えてください。
public class Product
{
public int ProductID { get; set; }
public int CategoryID { get; set; }
public string ProductName { get; set; }
public decimal UnitPrice { get; set; }
}
F5で前回までの変更と今日の修正が実行できることを確認してください。これまで3回の変更でコードのreadabilityがかなり向上したかと思います。明日からは、LINQを使ってQueryをかけていきます。