(1) C#のvarとは?型を調べる方法や制約事項についてもご紹介
(1-1) C#のvarとは?
(1-2) サンプルプログラム:varの基本動作確認#1
(1-3) サンプルプログラム:varの基本動作確認#2
(1-4) varの制約事項
(1-5) varの使いどころ
(1) C#のvarとは?型を調べる方法や制約事項についてもご紹介
C#の初学者向けにvarとは何か?またvar変数に入っている値の型を調べる方法と、varの制約事項についてご紹介します。
(1-1) C#のvarとは?
「var」はC#において「暗黙型」の「静的」(static=コンパイル時に型が決定)な変数の定義に利用します。
C#では変数を「暗黙型」(implicit=定義時は型が未決)か「明示型」(explicit=明示的に型を宣言)で定義する事ができますが、その中でも「var」キーワードで定義した「暗黙型」の変数はコンパイル時に型の判断を行い、自動で適切な型にキャストを行います。
「暗黙型」の主な使いどころとして「何のデータ型が来るか不明」な時や「複数のデータ型が配列に混じる」ケースなどで非常に力を発揮します(これらの例は後の節でサンプルプログラムを掲載)。
varを使った変数の宣言は、通常のデータ型と全く同じように行います。
(例)
//暗黙型(var) var name = "This is Explicitly typed"; //明示型(string) string name = "This is Implicitly typed";
そしてvar変数の「型」は値を変数に代入した時に決定され、値を代入後は通常の変数と同様に利用できます。
(1-2) サンプルプログラム:varの基本動作確認#1
(サンプルプログラム1)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RP_IT0198_var_usage
{
class Program
{
static void Main(string[] args)
{
var varInt = 999;
var varDouble = 999.999;
var varDecimal = 999m;
var varChar = '1';
var varString = "12345";
var varBool = true;
Console.WriteLine("{0}\n{1}\n{2}", varInt.GetType(), varDouble.GetType(), varDecimal.GetType());
Console.WriteLine("{0}\n{1}\n{2}", varChar.GetType(), varString.GetType(), varBool.GetType());
Console.Read();
}
}
}
(図121)実行結果

(1-3) サンプルプログラム:varの基本動作確認#2
次のサンプルはステートメント内で使用している例です。
(前半部分)
はvar変数にint型の配列を代入し、foreachステートメントを使って各要素にアクセスしています。
(後半部分)
StreamReaderクラスで「.log」ファイルを読み込んだ結果をvar変数で受け取っています(typeは「System.IO.StreamReader」)。
(サンプルプログラム2)
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RP_IT0198_var_usage
{
class Program
{
static void Main(string[] args)
{
//##(1)foreachステートメントでの利用
//## (1-1)varにint型の配列を代入し、
var IntArr = new[] { 1, 3, 5, 7, 9 };
Console.WriteLine("### Type of IntArr is "+ IntArr.GetType());
//## (1-2)foreachステートメントでループして要素を取得
foreach (var num in IntArr)
{
Console.WriteLine("{0}", num);
}
//##(2)usingステートメントでの利用
using (var logfile = new StreamReader(@"C:\Temp2\IT0198\sample.log"))
{
Console.WriteLine("### Type of logfile is " + logfile.GetType());
string lineinfo;
while ((lineinfo = logfile.ReadLine()) != null)
{
Console.WriteLine(lineinfo);
}
}
}
}
}
(図131)実行結果

(1-4) varの制約事項
varを使用するにはいくつかの制約事項があるので、それらについても触れておきます。
■使用できるケース
・varが使用できるのはローカル変数が同じステートメント内(if、using、try-catch、for、foreachなど振る舞いを決める記述)で宣言~初期化されるケースのみです。
■使用できないケース&制限事項
・クラススコープの変数としては利用不可(クラスのメンバ変数)。
・クラス内のメソッドの戻り値としては利用できません。
・プロパティ(private変数をget()やset()で読み書きする仕組み)のデータ型としては利用できません。
・nullには初期化できません。
・同一ステートメント内で利用できるvarは一つです。
(1-5) varの使いどころ
varが非常に活躍するケース(型が分からない場合)の具体的な例について、別だしの記事(下記)でご紹介しています。