重複の可能性:
var キーワードのポイントは何ですか?
こんにちは、みんな、
私の理解が正しいか確認したい。LINQ を使用しない場合、var を使用する唯一の利点は簡潔にすることですか? それは正しい理解ですか?
重複の可能性:
var キーワードのポイントは何ですか?
こんにちは、みんな、
私の理解が正しいか確認したい。LINQ を使用しない場合、var を使用する唯一の利点は簡潔にすることですか? それは正しい理解ですか?
いいえ、LINQ を使用しているかどうかに関係なく、匿名型var
を作成するために使用できます。
var anon = new { Name = "Anonymous", Age = 42 };
このようなタイプを扱うのも簡単です。非常に長いジェネリック型がある場合、宣言の一部として変数名を視覚的に識別するのに型名が邪魔になることがあります。
Dictionary<string, Dictionary<int, ICollection<object>>>
特に、戻って次のように変更した場合
Dictionary<string, IDictionary<int, ICollection<object>>>
msdnから:
Visual C#3.0以降、メソッドスコープで宣言される変数は、暗黙的な型varを持つことができます。暗黙的に型付けされたローカル変数は、自分で型を宣言したかのように強く型付けされますが、コンパイラーが型を決定します。次の2つのiの宣言は、機能的に同等です。
var i = 10; // implicitly typed
int i = 10; //explicitly typed
LINQクエリ以外では、varキーワードの使用には非常に注意が必要です。匿名タイプが必要な場合もありますが、これはごくわずかで、かなりの差があると思います。インテリセンス松葉杖を使用しない限り、コードを読み取るときに処理しているタイプがわからないため、Varは非常に混乱するコードにつながる可能性があります。
次のことを行うスニペットとコードのビットが非常に多く表示されることをますます心配しています...それは怠惰であり、varキーワードが意図したものではありません:
// Not too bad but still shouldn't be done because the only gain you have is keystrokes
var Something = new SomeObject();
// Type here is not obvious, are you getting an int, double, custom object back???
var Something = GetLengthOfSpaghettiCode();
したがって、LINQに使用します...匿名型に使用します(LINQの外部で匿名型を使用する場合は、なぜ必要なのかを実際に精査する必要があります)。
varの使用に関するMSDN (記事の最後の行)からの引用:
ただし、varを使用すると、少なくとも他の開発者がコードを理解しにくくなる可能性があります。そのため、C#ドキュメントでは通常、必要な場合にのみvarを使用します。
キーストロークを節約するためのショートカットとして使用しないでください。コードを次に見る人はそれを高く評価します。
LINQ を使用していない場合、var を使用すると、変数の型を 2 回ではなく 1 回だけ宣言できます。
例
var myObject = new MyObject();
対
MyObject myObject = new MyObject();
これはローカルでのみ実行でき、匿名型の宣言にも役立ちます。
例
var myAnon = new { Name = "Something", Count = 45 };
かなり、はい。var
変数に代入する値からコンパイラが変数の型を推測できる場所ならどこでも使用できます。(ただし、型推論規則は非常に複雑なので、完全に理解するには C# の仕様を読むことをお勧めします。)
匿名型を定義するためにキーワードが必要であるという点で、これはまったく正しくありません。var
例えば:
var foo = new { abc = 1, def = 2 };
もちろん、LINQ クエリの外部だけでなく内部でも使用できます。
var の使用が問題になるとは思いません。また、コードの読みやすさという理由から、var を使用することを好みます。まず第一に、var はシンタックス シュガーにすぎず、IL が出力されると適切な型にコンパイルされます。また、コードの可読性に関する限り、変数が使用される目的と、変数の型だけでなく、変数がどのように割り当てられるかに注目する方が理にかなっています。とにかく、VS .NET エディターは、それに続く行にタイプを表示します。したがって、これはまったく問題にならないはずです。また、デバッグに関する限り、Autos/Local/Watch ウィンドウが表示されている場合は、すべてのメンバーのタイプが表示されます。
次のようなコードを見る方が理にかなっています。
var customers = GetCustomerList();
foreach (var customer in customers)
{
customer.ProcessOrders();
}
とは対照的に
List<CustomerObjectDeserializedFromWebService> customers = GetCustomers();
foreach (CustomerObjectDeserializedFromWebService customer in customers)
{
customer.ProcessOrders();
}
var は公平を期すために、宣言時に初期化されるローカル変数宣言での使用に限定されています。その場合、実際の型を省略すると、IMO の読みやすさが確実に向上します。
編集:そして、以下のように使用法に対して警告しないのは私の側では不公平です:
var x = 20;
これは良くない; リテラルが複数の型に適用できる場合、リテラルのデフォルトの型を知っている必要があるため、x の型に対して何が推測されるかを理解する必要があります。はい、どうしても、そのような宣言は避けます。
WCF(Windows Communication Foundation)でもWebサービスなどで取得したデータを扱う際に使われていると思います。
また、 varを使用すると、低結合設計でのリファクタリングが容易になることもわかりました。これは、変数の型を強くする傾向があるためですが、通常、後続のコードはより弱い型を想定しています。varを使用して、型の変更をコンパイラに相殺します。