|
|
連載:[完全版]究極の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 ラムダ式を使った型を明示しない列挙 |
Insider.NET 記事ランキング
本日
月間