C# 匿名クラス (Anonymous Classes)
C# 匿名クラスとは?
C# 3.0 から「名前のないクラスを定義できる」ようになりました。
「名前のないクラス」のことを匿名クラス (Anonymous Class) といいます。
これだけだと、何のことだかわかりにくいかと思いますので、少し補足説明をします。
JavaScript のオブジェクトリテラルのような使い方...
JavaScript をご存知の方であれば、オブジェクトリテラルを用いたオブジェクトの作成方法に似ている、と考えるとわかりやすいと思います。
例えば、JavaScript では { } を用いて次のようにオブジェクトリテラルを使って、オブジェクトを定義することが可能です。
var person = { name: 'Ichiro', say_hello: function() { alert('Hello'); } };
こうすると次のように、say_hello メソッドを呼び出すことが可能です。
person.say_hello();
※ JavaScript にも興味がある人は当サイトの JavaScript によるオブジェクト指向プログラミングの記事もご覧ください。
ただし、あとで説明するように C# の匿名クラスでは、メソッドが定義できない、全てパブリックフィールドにしなければならない、などの制限があります。 (この意味で、これをクラスと呼んで良いのか?という疑問もわいてきますが、そういう議論はここではしません)
C# の匿名クラス
それでは、はじめに C# の匿名クラスの使い方から見てみましょう。
以下のコードに見られる、p という変数が匿名クラスのオブジェクトになります。
using System; namespace AnonymousClass1 { class Program { static void Main(string[] args) { var p = new { FirstName = "Keisuke", LastName = "Oyama", Age = 36 }; Console.WriteLine(p.FirstName); } } }
フィールド名 = 値 のペアをカンマで区切って並べるだけです。フィールドの型は、値を見てコンパイラがコンパイル時に決定します。
また、開発時においても Visual Studio のインテリセンスも下図のように有効となります。
匿名クラスの制限
ただし、前述の通り匿名クラスには以下のような制限があります。
- 定義可能なのはパブリック (public) メンバーのみ
- 全てのフィールドは初期化が必須
- static に出来ない
- メソッドの定義も出来ない
これを踏まえて、上手に使いたいものです。