(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が非常に活躍するケース(型が分からない場合)の具体的な例について、別だしの記事(下記)でご紹介しています。