C#で「var」とはどういう意味ですか?[重複]


回答:


160

これは、宣言されているローカルのタイプがコンパイラーによって推論されることを意味します。

// 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を使用してフィールド/プロパティ/パラメーター/戻り値の型を宣言することはできません。


@cdhowie言っている間、はvar foo = new Foo()fooタイプFooまたはそのスーパークラスのいずれかである可能性があります。それはどのようにして合法なのでしょうか?
John Strood

3
@Djackこれは合法ではありませんし、そうでもありません。 var foo = new Foo();と同じですFoo foo = new Foo();。つまり、スーパータイプではなく、参照、またはオブジェクトへの参照を任意のサブタイプにfoo含めることができます。FooFoo Foo
cdhowie

15

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

http://msdn.microsoft.com/en-us/library/bb383973.aspxから

Visual C#3.0以降、メソッドスコープで宣言された変数は、暗黙の型varを持つことができます。暗黙的に型付けされたローカル変数は、自分で型を宣言したかのように強く型付けされますが、コンパイラーが型を決定します。次の2つのiの宣言は機能的に同等です。

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

var キーボードのタイピングや視覚的なノイズを取り除くのに役立ちます。

MyReallyReallyLongClassName x = new MyReallyReallyLongClassName();

なる

var x = new MyReallyReallyLongClassName();

しかし、読みやすさが犠牲になるほど使い過ぎることがあります。


9

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

var myVar = new Connection();

Connectionタイプの変数を提供します。


7

初期化で割り当てられたものに基づいて型を宣言します。

簡単な例は、次のコードです。

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);

ここでは、それらが保持するタイプの名前がないため、定義iおよびj使用以外の方法はありませんvar


5

そのような変数初期化子を書くのが嫌いでしたか?

XmlSerializer xmlSerializer = new XmlSerialzer(typeof(int))

したがって、C#3.0以降では、次のように置き換えることができます。

var xmlSerializer = new XmlSerialzer(typeof(int))

注意点:タイプはコンパイル時に解決されるため、パフォーマンスに問題はありません。しかし、コンパイラはビルドステップ中にタイプを検出できるはずなので、などのコードvar xmlSerializer;はまったくコンパイルされません。


0
  • 名前が示すように、varはデータ型のない変数です。
  • どの方法で返されるデータの種類がわからない場合は、varを使用するのに適しています。
  • varは暗黙的なタイプです。つまり、システムはデータタイプ自体を定義します。コンパイラーは、「=」演算子の右側の値に基づいてその型を推測します。
  • int / stringなどは、明示的に定義されているため、明示的な型です。
  • Varはメソッド内でローカル変数としてのみ定義できます
  • 1つのステートメントで複数の変数を宣言して初期化することはできません。たとえば、var i = 1、j = 2; 無効です。
int i = 100;// explicitly typed 
var j = 100; // implicitly typed

0

varはC#の「コンテキストキーワード」です。つまり、変数を使用しているのと同じクラスのコンテキストで暗黙的にローカル変数としてのみ使用できます。「メイン」または他の外部クラス、またはインターフェイスなどから呼び出すクラスでそれを使用しようとすると、エラーCS0825 < https://docs.microsoft.com/en-us/dotnet/が発生します。 csharp /その他/ cs0825 >

使用できる場合と使用できない場合の説明については、こちらのドキュメントをご覧ください。< https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/implicitly-typed -local-variables#remarks >

基本的に、 "var myValue =" This is the value "などの暗黙の値を持つ変数を宣言する場合にのみこれを使用する必要があります。これにより、たとえば" string "を指定する場合と比べて少し時間が節約できますが、IMHOはそれほど時間はかかりません保存し、プロジェクトのスケーラビリティに制約を課します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.