連載:[完全版]究極のC#プログラミング

Chapter12 varによる変数宣言とコレクション初期化子

川俣 晶
2010/02/01

12.12 引数が2つのAddメソッドとコレクション初期化子

 DictionaryクラスのようにAddメソッドに引数が2つ(キーと値)ある場合でも、コレクション初期化子は使用できる。それを自作コレクションクラスでも活用するには、どのように記述すればよいのだろうか?

 この場合、単にAddメソッドの引数を2つに増やせばよい。つまり、次のリスト12.15のように、引数が2つのAddメソッドとIEnumerableインターフェースの実装という条件を満たしていればよい。

using System;
using System.Collections.Generic;

class SampleCollection<K, V> : IEnumerable<K>
{
  public void Add(K key, V val)
  {
    Console.WriteLine(
        "キー{0}値{1}は虚無の空間に格納された。", key,val);
  }

  public IEnumerator<K> GetEnumerator()
  {
    throw new NotImplementedException();
  }

  System.Collections.IEnumerator
    System.Collections.IEnumerable.GetEnumerator()
  {
    throw new NotImplementedException();
  }
}

class Program
{
  static void Main(string[] args)
  {
    var t = new SampleCollection<int, string>()
      {
        {16, "Hoshi"},
        {119, "Ban"},
      };
    // 出力:

     // キー16値Hoshiは虚無の空間に格納された。

     // キー119値Banは虚無の空間に格納された。
  }
}
リスト12.15 引数が2つのAddメソッドとコレクション初期化子

 ちなみに、同様の書き方で、引数3個のAddメソッドも可能であることを確認した。

【C#olumn】定数の型を厳密に知ろう

 暗黙的に型指定されるローカル変数を使用する場合、定数値が厳密にどのような型を持っているか知る必要がある。たとえば、123はint型であるが、2147483648はuint型である。123がint型だったからといって、うかつに大きな整数を使って「var a = 2147483648;」のように初期化すると、int型の変数を宣言したつもりがuint型になっていたということもありうるのである。

 また、符号なし整数の123を明示するには「123u」のように後ろに文字(サフィックス)を付けて表記する。たとえば、「var a = 123;」の場合、aはint型になるが、「var a = 123u;」の場合、aはuint型になる。つまり、サフィックスによって、定数値の型を明示的に示すことができる。

 これらのルールを把握することは、暗黙的に型指定されるローカル変数を使用するうえで重要なポイントになるので、主立ったルールを、「C#言語の仕様 2.4.4 リテラル*7」から抜粋して引用しておく。


 サフィックスのないリテラルの場合は、int、uint、long、ulongのうち、その値を表すことができる最初の型になります。

 リテラルのサフィックスがUまたはuの場合は、uintまたはulongのうち、その値を表すことができる最初の型になります。

 リテラルのサフィックスがLまたはlの場合は、longまたはulongのうち、その値を表すことができる最初の型になります。

 リテラルのサフィックスがUL、Ul、uL、ul、LU、Lu、lU、またはluの場合は、ulong型になります。

 実数リテラルのサフィックスがFまたはfの場合はfloat型です。例えば、1f、1.5f、1e10f、123.456Fなどのリテラルは、すべてfloat型です。

 実数リテラルのサフィックスがDまたはdの場合はdouble型です。例えば、1d、1.5d、1e10d、123.456Dなどのリテラルは、すべてdouble型です。

 実数リテラルのサフィックスがMまたはmの場合はdecimal型です。例えば、1m、1.5m、1e10m、123.456Mなどのリテラルは、すべてdecimal型です。

*7 C#言語の仕様はVisual Studioをインストールすると同時にインストールされる。標準的なインストールでは「C:\Program Files\Microsoft Visual Studio 9.0\VC#\Specifications\1041\CSharp Language Specification.doc」にある。

【Exercise】練習問題

 「var a = 1;」という行を、「var a = 1u;」と書き換えた。この書き換えによって発生した状況の説明として間違っているものはどれか?

  1. 1は符号付きの整数のint型である
  2. 1uは符号なし整数のuint型である
  3. varはあらゆる型を格納できる変数を宣言するので、int型がuint型に変わっても変数aに格納できる
  4. 書き換え前も書き換え後も正しいコードであり、コンパイル可能である
  5. 変数aの型はint型からuint型に変更された

 ◎解答:「3」(この行をマウスで選択してください)End of Article


 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 記事ランキング

本日 月間