はじめに
.NET入門コラムの連載記事にようこそ。タイトルにあるように、今回はC#でのプログラミングに役立つヒントを中心に話を進めます。まずC# 3.0のプログラミング言語としての要点をひととおり眺めた上で、Visual Studio 2008 C#の統合開発環境(IDE)がどのような点で生産性の向上に寄与するか調べ、読者にとって興味があると思われるVisual Studioの便利なプラグインをいくつか紹介します。今回の記事は.NET入門コラムのこれまでの連載記事とやや趣を異にしますが、これはこれで有用だと思います。
C# 3.0の基礎
C# 3.0はMicrosoft .NET 3.5 Frameworkの一部としてリリースされました。その主たる目的は、LINQ(Language INtegrated Query)の基盤を提供し、それによって統一されたデータアクセス機能を実現することにあります。個々の強化点は、単独で利用しても有益なものです。本稿では以下の各項目について関連するテクニックを紹介します。
- 自動実装プロパティ
using
キーワード- ローカル型推論
- オブジェクト初期化子とコレクション初期化子
- 拡張メソッド
自動実装プロパティ
自動実装プロパティとは、プライベートなフィールドを取得(get)または設定(set)するプロパティアクセサを実装するための簡略構文です。これにより、フィールドに基づくプロパティを作成するときに、実際にフィールドを作成しなくて済みます。このプロパティはコンパイル時にコンパイラによって自動的に生成されます。このプロパティには本体もフィールドもないため、単純にプロパティを取得するか設定する目的でのみ使用できます。プロパティの本体がないということは、ブレークポイントや妥当性検査のロジックを使用できないことを意味します。さらに、フィールドがないということは、デフォルト値がないことを意味します。Visual Studioでは「prop [tab][tab]」とタイプすると、自動実装プロパティを生成するためのコードスニペットが挿入されます。これでコードをずっと簡潔なものにすることができます。フィールドに基づくプロパティを従来のスタイルで書くと次のようなコードになります。
private int myProperty = 0; public int MyProperty { get { return this.myProperty; } set { this.myProperty = value; } }
同じフィールドを自動実装プロパティの形式で書くと次のように簡略化されます。
public int MyProperty { get; set; }
ただし、手を抜いて任せっきりにするのはよくありません。Customer
というクラスを定義する次のコードを見てください。ここではCustomerKey
プロパティを定義しています。通常、この種のキーフィールドは読み取り専用の項目とされ、一度設定したら変更することはありません。これを自動実装プロパティを使って簡単に片付けると、コードに望ましくない動作の余地を残すことになります。
class Customer { public string CustomerKey { get; set; } public string ContactName { get; set; } public string City { get; set; } }
このような場合、set
プロパティをプライベートとし、その値をコンストラクタで制御するようにコードを書き換えればよいと思われるかもしれません。確かにこれでCustomerKey
フィールドは外部からは保護されますが、このクラスは内部的にまだ変更される可能性を残しています。
class Customer { public Customer(string customerKey) { CustomerKey = customerKey; } public string CustomerKey { get; private set; } public string ContactName { get; set; } public string City { get; set; } }
実際のところ、CustomerKey
プロパティに自動実装プロパティはどうやら向いていないようで、このコードは次のようなスタイルで書く必要があります。この例で採り上げたクラスはかなり単純なものですが、これは自動実装プロパティを積極的に利用すべきながら、その扱いには慎重さが求められることを端的に示しています。
class Customer { public Customer(string customerKey) { this.CustomerKey = customerKey; } private readonly string customerKey; public string CustomerKey { get return this.customerKey; } public string ContactName { get; set; } public string City { get; set; } }