|
|
連載:[完全版]究極のC#プログラミング
Chapter12 varによる変数宣言とコレクション初期化子
川俣 晶
2010/02/01 |
 |
|
12.10 コレクション初期化子
配列ではないコレクションの初期化についても、C# 3.0は機能強化されている。
たとえば、List<T>クラスを用いたリストを作成する際、初期値を容易に指定することができる。1、2、3という3つの初期値を持つList<int>オブジェクトは、次のリスト12.12のように宣言することができる。
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
// コレクション初期化子の使用
var list = new List<int>() { 1, 2, 3 };
foreach (var i in list) Console.WriteLine(i);
// 出力:
// 1
// 2
// 3
}
}
|
|
リスト12.12 コレクション初期化子の使用 |
ここで、「new List<int>()」と書いてインスタンスを生成させた後に書かれた「{ 1, 2, 3 }」の部分が「コレクション初期化子」である。
コレクション初期化子は、一種のシンタックスシュガー(糖衣構文)であり、実際には列挙された値をAddメソッドで順次追加するコードがコンパイル時に生成される。そのため、このメソッドを実装し、それに加えてIEnumerableインターフェース(System.Collections名前空間)を実装すれば、自作クラスでコレクション初期化子を利用することもできる。
それを実現した例をリスト12.13に示す。
using System;
using System.Collections.Generic;
class WriteOnlyCollection<T> : IEnumerable<T>
{
public void Add(T item)
{
Console.WriteLine("値{0}は虚無の空間に格納された。", item);
}
public IEnumerator<T> GetEnumerator()
{
throw new NotImplementedException();
}
System.Collections.IEnumerator
System.Collections.IEnumerable.GetEnumerator()
{
throw new NotImplementedException();
}
}
class Program
{
static void Main(string[] args)
{
var collection = new WriteOnlyCollection<int>() { 1, 2, 3 };
// 出力
// 値1は虚無の空間に格納された。
// 値2は虚無の空間に格納された。
// 値3は虚無の空間に格納された。
}
}
|
|
リスト12.13 コレクション初期化子の実装 |
見てのとおり、Addメソッドは単に「Add」という名前のメソッドであればよい。特別なインターフェースは不要である。古い資料には、「System.Collections.Generic.ICollection<T>インターフェースのICollection<T>.Add(T)メソッドを使う」と書かれているものがあるが、これは誤りである。
一方、IEnumerableインターフェースを実装していないとコレクション初期化子は使用できないのだが、見てのとおり、機能の内容を実装する必要はまったくない。コレクション初期化子を利用するだけなら、呼び出されることはないようである。
Insider.NET 記事ランキング
本日
月間