|
|
連載:[完全版]究極のC#プログラミング
Chapter12 varによる変数宣言とコレクション初期化子
川俣 晶
2010/02/01 |
 |
|
12.4 なぜvarを使うのか?
しかし、いくら型が厳格にチェックされるとしても、明示的に型名を書かないことには批判もあるだろう。なぜなら、明示的に型を書くことを通じて検出されるバグや、そのようにして型が明示されることで、ソースコードのわかりやすさが向上するケースもあるからだ。
たとえば、「string」と6文字打つ手間をケチって「var」の3文字に手抜きするぐらいなら、6文字打つべきだと思う人もいるだろう。「int」の場合であれば、「var」に変えてもタイプする文字数に変わりはない。
この点については筆者もおおむね同意する。
しかし、型名はつねに短いわけではない。たとえば、次のリスト12.3のようなコードの場合はどうだろうか?
using System;
using System.Collections.Generic;
using System.Text;
namespace SampleProgram
{
class Program
{
static void Main(string[] args)
{
Dictionary<string, List<StringBuilder>> stringToBuilderMap
= new Dictionary<string,List<StringBuilder>>();
// ここに変数stringToBuilderMapを使用するコードがあると想定する
}
}
}
|
|
リスト12.3 きわめて長い型名で変数を宣言する例 |
このコードに含まれる変数の宣言には、次の2つの問題がある。
- 極端に長すぎてソースコードの読みやすさを損なっている
- 同じ型名(Dictionary<string, List<StringBuilder>>型)が2回書かれていて冗長
このようなコードに対してvarを用いることは特にデメリットはなく、かえってこれら2つの問題を解決する(リスト12.4参照)。
using System;
using System.Collections.Generic;
using System.Text;
namespace SampleProgram
{
class Program
{
static void Main(string[] args)
{
var stringToBuilderMap
= new Dictionary<string,List<StringBuilder>>();
// ここに変数stringToBuilderMapを使用するコードがあると想定する
}
}
}
|
|
リスト12.4 varを使用してリスト12.3を書き直した例 |
つまり、「暗黙的に型指定されるローカル変数」はC#を含むいくつかの言語に見られる次のような「新しいインスタンスで初期化する変数宣言で、型名を2回書かなければならない冗長性」を軽減してくれる。
このようなケースでvarを用いると、ソースコードの読みやすさを損なうこともなく、むしろ冗長性を排除することでわかりやすくなる効能も期待できる。積極的に活用すべきだろう。
一方で、newを使わない初期化(「int a = 1;」や「string s= "abc";」のようなタイプ)に使うべきかは微妙なところである。少なくとも、「int a = 1;」をあえて「var a = 1;」と書くメリットは思い付かないが、逆に反射的に変数宣言を「var」で書き始める習慣を付けてしまうと、「var a = 1;」と書いてもよいような気もする。
ちなみに、newキーワードや定数を使わずとも暗黙的な型指定は可能である。次ページのリスト12.5で、変数objは、暗黙的な型指定によりstring型となる。
using System;
class SampleObjectProvider
{
public static string GetSampleObject()
{
return "Hello!";
}
}
class Program
{
static void Main(string[] args)
{
var obj = SampleObjectProvider.GetSampleObject();
Console.WriteLine(obj);
}
}
|
|
リスト12.5 初期化を伴わない暗黙的な型指定 |
このような事例では、変数宣言の式から素早くその変数の型を読み取ることは難しく、ソースコードのわかりやすさを損なう可能性がある。
しかし、込み入った型名、覚えにくい型名などの場合、手抜きの手段として型名を書かずにvarで済ませる使い方はありうるだろう。
Insider.NET 記事ランキング
本日
月間