連載:[完全版]究極の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回書かなければならない冗長性」を軽減してくれる。

型名 変数名 = new 型名();

 このようなケースで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で済ませる使い方はありうるだろう。


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

本日 月間