ページ

2007年3月22日木曜日

C# 3.0 の partial methods

C# 3.0 (Visual Studio "Orcas" / .NET Framework 3.5) には partial methods が追加されるそうなんですが、情報があまりないのでググってみました。(Orcas CTP のドキュメントに記載されているそうですけどね)

Anders Hejlsberg on the future of C#: Partial methods
C# 3.0 Partial Method Definitions

上記の内容からすると、、、

// 定義
partial void onNameChanged();

// 実装
partial void onNameChanged()
{
??? // 内容
}

そして、partial method の制約は

  • partial class の中だけで使用可。
  • partial method は partial キーワードをつける必要があり、戻り値は void でないといけない。
  • partial method は ref パラメータは使えるが out パラメータは使えない。
  • partial method は暗黙に private で、 それゆえ virtual にはできない。
  • partial method は extern にはできない。
  • partial method は static と unsafe はつけられる。
  • partial method は generic にできる。
  • partial method の delegate は作れない。

といったものがあるそうです。

で、partial method っていうのが何をするものかというと、「実装があったらその実装を呼び出すようにするし、なかったら何もしない」 と言う風にコンパイラが解釈してくれるものだそうです。

たとえば、Hoge.designer.cs に

??? partial class Hoge
??? {
??????? partial void onNameChanged();

??????? private void Func()
??????? {
??????????? onNameChanged();
??????? }
??? }

とあった場合に、Hoge.cs で

??? partial class Hoge
??? {
??????? partial void onNameChanged()
??????? {
??????????? // 何かする
??????? }
??? }

と書けば Func() が呼び出されたときに Hoge.cs の onNameChanged() が呼び出されるようになります。Hoge.cs に partial void onNameChanged() の実装がなければ Func() は何もしないメソッドになるわけです (Func() にある onNameChanged() の呼び出しが削除される)。
もちろんこれはコンパイル時に解釈されます。virtual のように実行時に解釈されるわけではありません。ですので、IL などにはなんら変更はなく、C# コンパイラが拡張されただけです。(だと理解してます)

上の例でも .designer.cs と書いたように、自動生成されるコードで便利なように追加された機能といっていいと思います。

0 件のコメント:

コメントを投稿