web-dev-qa-db-ja.com

型の代わりにvarを使用する必要があるのはなぜですか?

可能性のある複製:
ReSharperおよびvar

ReSharperをインストールした後、可能な場合は常にvarを使用することを(警告により)要求します。

UnhandledExceptionEventArgs ue = (UnhandledExceptionEventArgs) t;

ReSharperはそれを変えたい

var ue = (UnhandledExceptionEventArgs) t;

私は最初のバージョンが好きです、varを好む理由はありますか?よりよい性能?何か?それとも単なるコードスタイルですか?

147
IAdapter

それは本当にコーディングスタイルです。コンパイラーは、両方のバリアントに対してまったく同じものを生成します。

パフォーマンスに関する質問については、こちらもご覧ください。

102
Martin Buberl

「警告」と言うとき、正確にはどういう意味ですか?私は通常、あなたがmay varを使用したいというヒントを与えることを見てきましたが、警告ほど厳しいものはありません。

Varとパフォーマンスの違いはありません-コードは同じILにコンパイルされます。潜在的な利点は読みやすさです-変数の型を割り当てのRHSで既に明確にしている場合(たとえば、キャストまたはコンストラクターの呼び出しを介して)、LHSでも変数の利点はどこにありますか?しかし、それは個人的な好みです。

R#でvarの使用を提案したくない場合は、オプションを変更するだけです。 ReSharperについての1つのこと:very設定可能:)

34
Jon Skeet

他の人が言ったように、次のいずれかを使用しても、コンパイルされたコード(IL)に違いはありません。

var x1 = new object();
object x2 = new object;

Resharperがあなたに警告するのは、[私の意見では] 2番目の例よりも最初の例を読む方が簡単だからだと思います。また、タイプの名前を2回繰り返す必要は何ですか?

以下を考慮してください、そしてあなたは私が意味するものを得るでしょう:

KeyValuePair<string, KeyValuePair<string, int>> y1 = new KeyValuePair<string, KeyValuePair<string, int>>("key", new KeyValuePair<string, int>("subkey", 5));

代わりにこれを読む方が簡単です:

var y2 = new KeyValuePair<string, KeyValuePair<string, int>>("key", new KeyValuePair<string, int>("subkey", 5));
15
Alex Essilfie

この場合では、単なるコーディングスタイルです。

varの使用は、匿名型を扱う場合にのみ必要です。
他の状況では、それは好みの問題です。

14
Henk Holterman