2010-11-29 5 views

答えて

128

それは、宣言されている地元のタイプは、コンパイラによって推測されることを意味します:

// This statement: 
var foo = "bar"; 
// Is equivalent to this statement: 
string foo = "bar"; 

注目すべきは、varはダイナミック型である変数を定義していません。だから、これは合法ではない:

var foo = "bar"; 
foo = 1; // Compiler error, the foo variable holds strings, not ints 

varは2つの用途があります。

  1. これは、入れ子になったジェネリック型として変数を宣言する場合は特に、変数を宣言するために少ないタイピングが必要です。
  2. 匿名型のオブジェクトへの参照を格納するときに型名を事前に知ることができないので、使用する必要があります:var foo = new { Bar = "bar" };

あなたは地元の人々が、何の型としてvar使用することはできません。したがって、キーワードvarを使用してフィールド/プロパティ/パラメータ/戻り値の型を宣言することはできません。

+1

これは、Stack Exchangeのような回答が必要な場合の良い例です。時には、人々は重要な情報を省略したり、短く、その要点に失敗したりすることがあります。 – Panzercrisis

+0

@cdhowie 'var foo = new Foo()'、 'foo'の型が' Foo'かスーパークラスの場合はどうでしょうか?それはどのように法的になりますか? –

+2

@Djackそれは合法ではない、そしてそうではない。 'var foo = new Foo();'は 'Foo foo = new Foo();'と同じことです。つまり、 'foo'は' Foo'参照を含むことができ、オブジェクトへの参照は 'Foo' **サブ**タイプ、*そうでない*フー**スーパー**タイプ。 – cdhowie

12

これは、データ型がコンテキストから派生(暗示)されていることを意味します。

http://msdn.microsoft.com/en-us/library/bb383973.aspx C#3.0のVisualに始まり

から、メソッドのスコープで宣言された変数 は は、暗黙の型VARを持つことができます。 暗黙的に型指定されたローカル変数は と同じように厳密に型指定されていますが、 型は自分で宣言していますが、 コンパイラによって型が決定されます。私の 次の2つの宣言は、機能的に同等 ある:

var i = 10; // implicitly typed 
int i = 10; //explicitly typed 

varは、キーボードタイピングおよび視覚ノイズ、例えばを除去するために有用である

MyReallyReallyLongClassName x = new MyReallyReallyLongClassName(); 

var x = new MyReallyReallyLongClassName(); 

なるが可読性を犠牲にしているところまで使いすぎる可能性があります。

7

"var"は、コンパイラが使用法に基づいて変数の明示的な型を決定することを意味します。たとえば、

var myVar = new Connection(); 

のように、Connectionタイプの変数を指定します。

3

このような変数イニシャライザを書くのは嫌でしたか?

XmlSerializer xmlSerializer = new XmlSerialzer(typeof(int)) 

だから、C#3.0で始まる、あなたは

var xmlSerializer = new XmlSerialzer(typeof(int)) 

つの通知でそれを置き換えることができます。タイプは、コンパイル時に解決されないので、パフォーマンスに問題れます。しかし、コンパイラーはビルドステップ中にタイプを検出できるはずですので、var xmlSerializer;のようなコードはまったくコンパイルされません。

4

初期化で割り当てられた内容に基づいてタイプを宣言します。

var i = 53; 

53の種類を調べ、基本的にこれをリライトします::私たちが持つことができる一方であること

int i = 53; 

注:

long i = 53; 

簡単な例では、コードがということです

これはvarでは発生しません。で、それは可能ですが:同様

var i = 53l; // i is now a long 

var i = null; // not allowed as type can't be inferred. 
var j = (string) null; // allowed as the expression (string) null has both type and value. 

これは、複雑なタイプとマイナー利便することができます。これは、匿名型でより重要である:

var i = from x in SomeSource where x.Name.Length > 3 select new {x.ID, x.Name}; 
foreach(var j in i) 
    Console.WriteLine(j.ID.ToString() + ":" + j.Name); 

はここで、彼らが保持するタイプには名前がないようvarを使用するよりもijを定義する他の方法はありません。

関連する問題