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

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

川俣 晶
2010/02/01

12.6 varを活用できる場面

 特にvarを活用できる場面も2つ紹介しておこう。using文やforeach文でもvarは使用できるのである。

■usingステートメントで使用するvar

 usingステートメントでvarは使用できる。そして、このケースでは、ほかのケース以上にメリットを享受できる印象がある。

 usingステートメントは、確実なファイルのクローズを実現するためにファイルの入出力とともに使うことも多いが、このとき、式が長くなる頻度が比較的高い。なぜかといえば、次のような理由があるためである。

  • そのソースファイル中でファイルを扱うコードが少ないときは、「using System.IO;」を入れないで、クラス名をフルネームで書いて使用したいことがある(たとえば、Fileクラスを使用するのに「System.IO.File」と書けば、「using System.IO;」は書かなくてよい)
  • そもそも、Visual Studioのデフォルトでは「using System.IO;」は記述されていないので、書き足さないで簡単にソースが書けるなら、そうしたい
  • 式にはファイル名などの引数が多く入り、引数も長くなりがち

 次のリスト12.7は、実際に名前空間込みで記述して長くなった例である。

using System;

class Program
{
  static void Main(string[] args)
  {
    using (System.IO.StreamWriter writer
                           = System.IO.File.CreateText("log.txt"))
    {
      writer.WriteLine("application log……");
    }
  }
}
リスト12.7 名前空間込みで長くなるクラス名

 このusingステートメントの行は、次のようにvarを使って書き直すと、大幅に読みやすくなる

using (var writer = System.IO.File.CreateText("log.txt"))

■foreachステートメントで使用するvar

 C#のforeachステートメントは、列挙するアイテムの型を明示することができる。この特徴はC# 1.0時代には非常に便利であった。なぜなら、ジェネリック導入前の.NETのコレクションは、型を明示しない何でも入るスタイルだったからである。

 次のリスト12.8のようなコードでは、キャストを書くことなく、汎用コレクションから整数を取り出しつつ列挙することを可能とした。キャストなしで「item * 2」という乗算が可能となるのは、foreachステートメントでint型を明示して、コレクションのアイテムを受け止めているためである。

using System;
using System.Collections;

class Program
{
  static void Main(string[] args)
  {
    ArrayList items = new ArrayList();
    items.Add(123);

    foreach (int item in items)
    {
      Console.WriteLine(item * 2);
    }
  }
}
リスト12.8 型の明示が意味を持つforeachステートメント

 しかし、ジェネリック導入後のC#にとって、foreach文での型の明示はあまり意味のある機能とはいえない。コレクションを列挙する場合、列挙されるアイテムの型はコレクションの型に決まっているためである(あえて別の型で受けるという選択肢がないわけではないが)。

 したがって、C# 3.0では、foreachステートメントにvarを用いて、列挙されるアイテムの型をソースコード上で明示しないことも有効だろう(リスト12.9参照)。

using System;
using System.Collections.Generic;

class Program
{
  static void Main(string[] args)
  {
    var items = new List<int>();
    items.Add(123);

    foreach (var item in items)
    {
      Console.WriteLine(item * 2);
    }
  }
}
リスト12.9 列挙されるアイテムの型をソースコード上で明示しない例

 ちなみに、単に型を明示しないで列挙するだけなら、ラムダ式を使う方法もある(リスト12.10参照)。

using System;
using System.Collections.Generic;

class Program
{
  static void Main(string[] args)
  {
    var items = new List<int>();
    items.Add(123);

    items.ForEach((item) =>
    {
      Console.WriteLine(item * 2);
    });
  }
}
リスト12.10 ラムダ式を使った型を明示しない列挙


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

本日 月間