連載:[完全版]究極の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インターフェースを実装していないとコレクション初期化子は使用できないのだが、見てのとおり、機能の内容を実装する必要はまったくない。コレクション初期化子を利用するだけなら、呼び出されることはないようである。


 INDEX
  [完全版]究極のC#プログラミング
  Chapter12 varによる変数宣言とコレクション初期化子
    1.12.1 暗黙的に型指定されるローカル変数
    2.12.2 Variant型の悪夢
    3.12.3 暗黙的に型を明示する
    4.12.4 なぜvarを使うのか?
    5.12.5 varが使用できない場面
    6.12.6 varを活用できる場面
    7.12.7 暗黙的に型指定されるローカル配列
    8.12.8 暗黙に型付けされた配列と型の推測
    9.12.9 暗黙に型付けされた配列とnull
  10.12.10 コレクション初期化子
    11.12.11 Dictionaryクラスとコレクション初期化子
    12.12.12 引数が2つのAddメソッドとコレクション初期化子/C#olumn
 
インデックス・ページヘ  「[完全版]究極のC#プログラミング」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間