なぜReSharperはすべてにvarを使用したいのですか?


214

Visual StudioでReSharperを使い始めたばかりです(SOに関する多くの推奨事項の後)。それを試すために、私は最近のASP.NET MVCプロジェクトを開きました。私が気づいた最初で最も頻繁なことの1つは、ほとんど/すべての明示的な宣言をvar代わりに変更することです。例えば:

//From This:
MyObject foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);
//To This:
var foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);

そして、さえのような単純型と、上のようにintboolなど

なぜこれが推奨されているのですか?私はコンピュータサイエンスや.NETの出身ではなく、最近.NET開発に「陥り始めた」ので、何が起こっているのか、それが有益かどうかを本当に理解したいと思います。



27
私はこれについてしばらく考えていましたがvar、タイプがまったく明らかでない場合でも、常にを使用する必要があるという結論に達しました!それがためである強制的に私が思い付くことができる最もわかりやすい名前を選択する私を、最終的にそれははるかに読みやすい多くのコードを、作ります。最終的には、ロジックを実装から分離するのにも役立ちます。もちろん、それは私の意見です。誰かを助けることを願っています;)
MasterMastic 2013年

回答:


189

1つの理由は、読みやすさの向上です。どちらが良いですか?

Dictionary<int, MyLongNamedObject> dictionary = new Dictionary<int, MyLongNamedObject>();

または

var dictionary = new Dictionary<int, MyLongNamedObject>();

260
私は最初のものを言うでしょう。何が起こっているのか簡単に確認できます!
Mongus Pong

104
菌類:あなたは好きですかあなたは冗長テキストが好きですか冗長テキスト?:D
マークシンプソン

73
私の意見では、明示的であることはより明確です。varを使用して多くのシナリオで頭痛の種を作成します。
user1231231412 2012年

172
開発者が使用している場合、私はそれを嫌うvarすべてのために-私はたくさんおよびTFS(ウェブベースの差分)を使用して、コードレビューの多くを行うと、それが私の仕事は非常に困難なもの:すなわちvar items = GetSomeItems();IDataReader dr = GetSomeItems();の両方が、使用しているときに私がキャッチしやすい上の文を使用して、不足しているIDataReadervar
Chris Gessler 2013

17
優れた開発者が優れたコードを記述していて、Resharperなどのライブラリを使用している場合は、処理する明示的な型を知る必要はありません。具象クラスではなく、インターフェイスを使用してコントラクトを宣言する場合と同様に、varを使用すると、戻り値の「タイプ」が何であるかを気にせず、何をするかだけを気にし、適切な名前の変数を使用できます。 intelli-sense&resharper / VSヘルパー(CTRL + CLICKで定義にナビゲートするなど)を使用すると、そこまでの道の99%が得られます。さらに、varを使用すると、メソッドの戻り値の型を変更した場合にコードベースを書き直す必要がなくなります。
Joshua Barker

286

ReSharperが示唆するのは、明らかにvarキーワードの使いすぎです。タイプが明らかな場合に使用できます。

var obj = new SomeObject();

タイプが明確でない場合は、書き出す必要があります。

SomeObject obj = DB.SomeClass.GetObject(42);

36
悪魔の擁護者を演じるために、おそらくメソッドまたは変数名から型が明確でない場合、それはvarの過度の使用よりも多くの名前付けに問題があることを示しています。ただし、基本的には同意します。varは、明快さを失わない場合にのみ使用する必要があります。
Matt Briggs、

33
このインスタンスでは、より適切な変数名を使用します。あなたは基本的に、型を理解するために変数がどこに定義されているかを調べるために調べることを提案しています-私は変数の名前をよりわかりやすくするために変数にもっと良い名前を付けることを提案しています。
Jaco Pretorius

18
@Jaco:+1ですが、型に関する情報を変数名に含めることはお勧めしません。たとえば、ハンガリー語の表記は良い習慣とは見なされていません。
Roman Boiko

8
ReSharperのデフォルト設定が過度に使用されているかどうかvarは意見の問題であり、何かを「明確に」ではありません。コンパイラーが自分で理解できるものをタイプしない方がいいです。私はC#の型推論が好きで、F#の型推論と同じくらい良かったのにと思っています。可能であれば、F#の標準と同様に、メソッドのパラメーターと戻り値の型から明示的な型を除外します。もちろん、誰もが同意するわけではありません。
Joel Mueller、

15
@AnonymousType:あなたはまだポイントを逃しています。メソッド名は常にメソッドの意図を反映する必要があるとおっしゃいましたが、たとえそうであっても、名前が戻り値のタイプを指定しているわけではありません。Streamたとえば、オブジェクトから読み取るメソッドの名前はRead、ではなくReadAndReturnNumberOfBytesAsInt32です。
Guffa 2013年

99

私は個人的にはこの提案をオフにすることを好みます。を使用varすると、読みやすさが向上することがよくあります。しかし、あなたが言ったように、それは時々それを減らします(単純な型で、または結果の型が不明瞭なとき)。

いつ使用するか、使用varしないかを選択します。しかし、再び、それは私だけです。


11
ReSharperはかなり賢いものだと思っていました。結果の型が明白であるとき(たとえば、新しいキーワードを持つ何か)といつ明白でないかを知るのに十分スマートではないでしょうか?
DisgruntledGoat

3
まあ、私はその機能の特異性を知りませんが、私が機能の提案の量に圧倒されたことは確かです。そして、私もvarかなり頻繁に使用します。
Bryan Menard、

5
常にvarを使用すると(resharperの提案のように)、変数に適切な名前を付ける必要があることがわかりました。
Sauleil、2011年

提案をオフにできますか?
クリスS

@AngeDeLaMort:重要なのは、不適切な名前feを使用することを強制することですvar methodXYResultIntArray。それはすべてのコーディング標準に反し、ほど簡潔ではありませんint[] methodXYResultbyte[]今後メソッドからaを返したい場合、すべての変数名が間違っています。明示的な型を使用すると、これを非常に簡単にリファクタリングできます。使用するには理由があるvarと、feがDictionary<string, List<SomeType<int>>>。しかし、full-type-nameが長すぎずnew、右側(または明示的なキャスト)で使用しない場合、リシャーパーはそれを提案すべきではありません。
Tim Schmelter 2017年

69

varコードの即時の理解を減らしながら、コードの可読性を高めることができます。同様に、他の状況でのコードの可読性が低下する可能性があります。時々それの使用は中立です。理解力の読みやすさの尺度は比例していませんが、状況によって異なります。時々両方が一緒に増加または減少します。

要因は、何varに適用されているか、およびターゲットがそのデータタイプをリーダーに即座に難読化するのをどの程度サポートしているか、または手元のプログラム部分を理解するためにタイプ情報が必要かどうかです。

たとえば、不適切な名前を付けるとvar、コードの理解度が低下する可能性があります。varただし、これはのせいではありません。

var value1 = GetNotObviousValue(); //What's the data type? 
//vs. 
var value2 = Math.Abs(-3); // Obviously a numeric data type. 

var単純なデータ型を使用しなくても、コードが読みやすくなると意味がない場合があります。

var num = GetNumber(); // But what type of number?
// vs. 
double num = GetNumber(); // I see, it's a double type. 

varの複雑さを確認する必要がないデータタイプ情報を非表示にするのに役立つ場合があります。

    IEnumerable<KeyValuePair<string,List<Dictionary<int,bool>>>> q = from t in d where t.Key == null select t; // OMG! 
    //vs. 
    var q = from t in d where t.Key == null select t;

    // I simply want the first string, so the last version seems fine.  
    q.First().Key; 

匿名型が存在する場合は、それを呼び出すための型名がないため、使用する必要ありますvar

var o = new { Num=3, Name="" };

にもかかわらずVisual Studio Intellisenseが型情報を提供している場合var、支援なしで厳密なコード読み取りを介して理解に頼る必要が少なくなります。誰もがIntellisenseを持っている、または使用しているわけではないと想定するのがおそらく賢明です。

上記の例に基づいて要約すると、varここに示すように、ほとんどのことは適度に、手元の状況に基づいて行うのが最善であるため、カルテブランチを適用することはお勧めできません。

なぜResharperはデフォルトでそれをすべて使用するのですか?状況のニュアンスを解析して、いつそれを使用しないのが最善かを判断することができないので、簡単にすることをお勧めします。


5
あなたの例が実際に使用する正当な理由である場合var、私はまともなメソッド名を書くことを強制します。GetNumber() -but what type?-まあ、なぜあなたは気にしますか? 知っておくことがそれほど重要である場合は、メソッドを呼び出しGetNumberAsDouble()ます。これによりstring、1 つのメソッドが返され、もう1 つのメソッドが返される場合も同様に明確に機能しますdouble
nicodemus13 2015

10
@ nicodemus13一般に、関数自体を作成するときではなく、実際に戻り値を使用するときに、関数の戻り値の型に注意する必要があります。提案された命名方式はGetResultsAsIEnumerableOfDoubleのような乱用につながる可能性があり、varを使用して割り当ての左側から削除した型情報を割り当ての右側にシフトするだけです。
エリック

var value2 = Math.Abs​​(-3); //明らかに数値データ型。申し訳ありませんが、Absメソッドには7つのオーバーロードがあり、見たときに不明瞭になるだけなので、これには完全に同意しません
。imo– s1cart3r

varは、次のような微妙な論理エラーを引き起こす可能性もあります。varcounter = "0"; 必要なものが整数の場合。
alaniane

42

ReSharper(8.02、おそらく他のバージョン)では、最初にReSharperのオプションメニューを開くことで、「暗黙的に型付けされたローカル変数宣言を使用する」提案のオプションを好みに合わせて調整できます。

ReSharperオプションメニュー

次に、「コードインスペクション」で、選択した言語の「インスペクションの重大度」を調整します。私の場合はc#です。

暗黙的に型付けされたローカル変数の提案をオフにする

ご覧のとおり、ReSharperが行うすべての提案を調整するオプションがあります。これが私のような「var」使用戦略がすでにあり、ReSharperにそれを尊重したいと思っている人を助けることを願っています:)


これは、まったく尋ねられなかった別の質問に答えます。
Carles Alcolea 2017年

9
しかし、それはここに来るときにそれを探す多くの人に関連しています。+1
Ori Nachum 2017年

24

インスタンス化されたオブジェクトのタイプを変更する方が簡単だと誰も言っていないことに驚いています。

AVeryLongTypeName myVariable = new AVeryLongTypeName( arguments );

ある繰り返しの形AVeryLongTypeName派生クラスの1つに変更したい場合は、使用時に一度変更するだけvarで、子クラスのメソッドにアクセスできます。

それとは別に、読みやすさの向上は重要なポイントですが、他の人が言ったように、varを使いすぎてはいけないので、Resharperでヒントをオフにしても問題ありません。


「新規」ではなくファクトリメソッドを呼び出す場合に非常に役立ちます
Ian Ringrose

最初にコードを作成するときに 'MyClass'を使用する必要があり、それが機能する場合は、機能します。それを変更する必要がある場合は、どこにでも行って変更する必要があります。特に、インターフェースが関係している場合はそうです。コードはエッセイのように扱うべきではなく、意味論的で明確に定義する必要があります。
Piotr Kula

24

「var」は明確であること

を使用するかどうかに関する主な議論 varキーワードは、コードがあなたや他の開発者にとってどれほど読みやすいかについてです。

まるで物語を書いているかのように、明確な正解はありません。しかし、これのいくつかの例を分かりやすい英語で見てみましょう。

ジェイクはビルに挨拶した。彼は彼が好きではなかったので、彼は振り向いて反対方向に行きました。

誰が反対に行きましたか?ジェイクかビルか この場合、「Jake」と「Bill」という名前を使用するのは、タイプ名を使用するのと同じです。そして「彼」と「彼」はvarキーワードを使うようなものです。この場合、より具体的にするのに役立ちます。次の例は、はるかに明確です。

ジェイクはビルに挨拶した。ジェイクはビルが気に入らなかったので、振り向いて反対方向に行きました。

この場合、より具体的にすることで文がより明確になりました。しかし、常にそうなるとは限りません。場合によっては、具体的にすると読みにくくなります。

ビルは本が好きだったので、ビルは図書館に行き、ビルはいつも好きな本を取り出しました。

この場合、「彼」を使用し、場合によっては彼の名前をすべて省略すると、文を読みやすくなります。これは、varキーワードを使用するのと同じです。

ビルは本が好きなので、図書館に行って、いつも好きな本を取り出しました。

これらの例は要旨をカバーしていますが、すべてを説明しているわけではありません。それらの例では、人を参照する方法は1つしかありませんでした。それらの名前を使用するか、「彼」や「彼」などのより一般的な用語を使用します。

コードの場合、わかりやすくするために3つの方法があります。タイプ、変数名、および割り当て。たとえば、次のコード行を見てください。

Person p = GetPerson();

問題は、何が起こっているのかを理解するのに役立つコード行に十分な情報があるということです。

次のコード行はどうですか?pこの場合の意味をまだ知っていますか?

var p = GetPerson();

今はどう:

var p = Get();

または今:

var person = Get();

またはこれ:

var t = GetPerson();

またはこれ:

var u = Person.Get();

キーワードかどうか varが特定のシナリオで機能する、変数、クラス、メソッドの命名方法など、コードのコンテキストに大きく依存します。また、コードの複雑さと、それを取り巻く残りのコードにも依存します。

個人varは、ほとんどの場合、より包括的なキーワードを使用するのが好きです。ただし、変数にはタイプにちなんだ名前を付ける傾向があるため、実際に情報が失われることはありません。

それは時々私が例外を作る文脈に依存して言った、それは複雑なものの性質であり、ソフトウェアは複雑でないとしても何もない。


1
varその1行を読んでいる間、それが何であるかを知っている限り、私は何も反対しないので、私はこの答えが一番好きです。別のドメインモデルを使用する別のソリューションのメソッドが何を返すのかわからない場合は、その型を明示的に定義しておくと、読みやすくなります。+1
ピオトルクラ

返されたタイプが明らかでないすべてのケースで、有用な情報を省略しているので、varを使用しないでください。
2016年

18

これも嫌いです。

私はこれがの使用についての議論になることを望まないvar、それはその用途を持っているが、どこでも使用されるべきではない。

覚えておくべき重要なことは、ReSharperはあなたが望むどんなコーディング標準にも設定されているということです。

編集:ReSharperとvar


13
1年かそこら抵抗した後、私はほとんどいつもいつもvarを使っています。
LiamB 2013

15

正しい答えはたくさんありますが、完全な答えはありません。

ReSharper varがデフォルトで使いすぎているのは事実です。ほとんどの人はそれに同意するでしょう。また、varを使用すると読みやすくなり、newステートメントを使用する場合など、型が明確になります。使用のヒントのみを表示するように検査の重大度を更新する方法を示した投稿を1つ見ましたvar

私は最初に他の投稿にコメントしてこれらを設定する場所を追加しようとしましたが、その評判はありませんでした。どうやら、私も設定のスクリーンショットを投稿する評判がありませんでした。

そこに着く方法を説明します。

Visual Studioで>メインメニュー> Resharper>オプション>コード編集> C#>コードスタイル>宣言でのVarの使用

  • 組み込み型の場合明示的な型を使用
  • 単純型の場合は、明らかな場合は 'var'を使用します
  • 他の場所では「var」を使用

ここに画像の説明を入力してください

ReSharperヘルプドキュメント:コード構文スタイル:暗黙的/明示的な入力( 'var'キーワード)— 'var'キーワードを使用するための設定を構成します


これは、varのディベート以外では正解としてマークする必要があります。これはバランスの取れたアプローチです
Brian Ogden

「明白なところ」がどのように決定されるかについて例を挙げていただけますか?
2016年


13

私のルールはこれです:

  • あなたは(つまり、プリミティブ型を宣言しているbytecharstringint[]double?decimal、など)?->タイプを使用:

    string myStr = "foo";
    int[] myIntArray = [123, 456, 789];
    double? myDouble = 123.3;
  • あなたは、複合型を宣言している(すなわちList<T>Dictionary<T, T>MyObj)?->使用var

    var myList = List<string>();
    var myDictionary = Dictionary<string, string>();
    var myObjInstance = new MyObj();

私は同意しませんが、string myStr = "foo";それが文字列であることは明らかです。私はすべての例をvarカテゴリを使用し、メソッドから返された宣言を使用して明示的なタイプを使用します。しかし、結局のところ、それはあなたとあなたのチームが特定のプロジェクトにとってより良いと感じるものです。
Dean Meehan

12

"var"の使用がC#コーディング規約で推奨されていることを指摘したい

変数の型が割り当ての右側から明らかである場合、または正確な型が重要ではない場合

だからこそ、ReSharperのチップはデフォルトでオンになっているのだろう。また、同じドキュメントのすぐ下の読みやすさを向上させない場合もあります。


これは、型が由来していることがわかっている場合に最適です。System.Diagnostics.PerformanceCounter() そのパフォーマンスカウンターは、組み込みの診断クラスから簡単に識別できます。しかし、ここではどのタイプが返されますか?var thingyMaBob = GetThatSpecialThing(18,null,(MyEnum)2)?特に、ソリューションに100をはるかに超えるプロジェクトがある場合は、クロックの手がかりはありません。
Piotr Kula

「変数の型が明らかな場合に推奨」および「同じドキュメントのすぐ下の読みやすさを向上させない場合もあります」。正直なところ、私はあなたのポイントを逃したと思います。私の答えはあなたが言うのと同じことを言っています。
jose

6

ReSharperはお勧めします varオブジェクトの作成をすっきりさせる傾向があるため、ています。

次の2つの例を比較してください。

StringBuilder bld = new StringBuilder();

var bld = new StringBuilder();

読みやすくするための省略形です。

「new」で明示的に新しいオブジェクトを作成するのは問題ないと思います。ただし、例では、クラスに適切な名前が付けられていないかどうかは明らかではない場合があります。


6

ところで、ReSharperは「この提案をあなたのコードに適用したい」と「あなたのコードは壊れている、私が修正したいのか?」を区別しています。var「ネストを減らすためならば反転」キーワードは、のようなものと一緒に、提案のカテゴリです。あなたはそれに従う必要はありません。

[オプション]ダイアログから、またはそのアラートのポップアップメニューから直接、各アラートの煩わしさを設定できます。var提案などをダウングレードして目立たなくしたり、「拡張メソッドを使用」アラートなどをアップグレードして実際のエラーとして表示したりできます。


5

var.Net 3.0 の機能は、単なる型推論であり、タイプセーフであり、多くの場合、コードを読みやすくします。ただし、その必要はありません。必要に応じて、この推奨事項を再度シャープにオフにすることができます。


4

Varはすごい!var動的な型にバインドされているという印象を受けている開発者に多く遭遇しましたが、そうではありません。それはまだ静的に型付けされており、コンパイラーによって決定されます。

ここにvarを使用することのいくつかの驚くべきポジティブがあります

入力変数が少ないほど、たとえば

Dictionary<int,IList<string>> postcodes = new Dictionary<int,IList<string>>()Yukのように短くて読みやすくなります。

var postcodes = new Dictionary<int,IList<string>>()\ o / \ o /

よりわかりやすい変数名 -微妙な名前ですvarが、ここでは流動的な性質を輝かせることが重要だと思います。var少し曖昧で、それは本当に自分自身のためにタイプ話すをさせるのではなく、多くのdesciptive変数名を奨励しません。

コードの変更が少ない -メソッド呼び出しの戻り値の型が変更された場合。メソッドの呼び出しを変更するだけでよく、使用されるすべての場所を変更する必要はありません。

匿名型 -匿名型は、特にWebApi 部分リソースなどの領域では、非常に強力な概念です。varがないと使用できません。

ただし、明示的に型を宣言すると便利な場合があります。これは、プリミティブまたは構造体で最も役立ちます。たとえば、私は個人的にこの構文があまり役に立たないと思います。

for(var i = 0; i < 10; i++) 
{

}

for(int i = 0; i < 10; i++) 
{

}

それはすべて個人の好みにかかっていますが、var実際に使用することで開発がスピードアップし、匿名型の良さの世界全体のロックが解除されます。


2

技術的な違いはありません。varを使用する場合、型はコンパイラによって暗黙的に指定されます。次のようなコードがある場合:

var x = 1;

xはintであることが暗黙に示され、他の値を割り当てることはできません。

varキーワードは、変数のタイプを変更する場合に役立ちます。次に、2つではなく1つの変更を行うだけで済みます。

var x = 1; --> var x = "hello";
int x = 1; --> string x = "hello";

1
@AlexKamburov以下の10行のコードはとにかく壊れますが、varとは関係ありません。
user3285954 2015

1
@ user3285954場合によっては、varで問題を隠すことができます。その場合、状況が醜くなります。問題はコードを書くことではなく、保守性にあります。varを使用するとよりクリーンであると主張する人もいますが、難読化することもあります。それは宗教的な議論に近いです。 brad-smith.info/blog/archives/336 私は個人的に、varをLinqステートメントや、型の宣言が本当に冗長な他の場所でのみ使用しています。varは良い追加であり、それを導入する理由についてのAnders Hejlsbergのコメントを人々が見る必要があると思います。
Alex Kamburov、2015

2

varキーワードはC#3.0で導入されました。これにより、タイプを明示的に指定することを忘れることができます。

使用するかどうかに実質的な違いはありません

MyObject foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);

または

var foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);

純粋な読みやすさとエラーの可能性が少ないことを除いて。

ありきたりな例のように見えますが、次のようにすると理解に役立つ場合があります。

var myInt = 23;

int型を返しますが、

var myInt = "23";

stringタイプを返します。

MSDNリファレンス


2

明示的なオブジェクトタイプの指定は、どういうわけか冗長です。英語で翻訳したとしても、「X型のオブジェクトをX型の変数に入れる」と「X型のオブジェクトを変数に入れる」のように冗長に聞こえます。

ただし、「var」の使用には制限があります。それは純粋な美しさである以下の多型の使用を防ぎます:

犬が動物を伸ばすと仮定します。猫は動物クラス階層を拡張します:

Animal x = new Dog();
DoStuffWithDog(x as Dog);

x = new Cat();
DoStuffWithCat(x as Cat);

void DoStuffWithDog(Dog d){}
void DoStuffWithCat(Cat c){}

xが 'var'で宣言された同じコードはコンパイルされません

var x = new Dog(); // from this point, x is a Dog
DoStuffWithDog(x as Dog);

x = new Cat(); // cannot assign a Cat instance to a Dog
DoStuffWithCat(x as Cat);

void DoStuffWithDog(Dog d){}
void DoStuffWithCat(Cat c){}

とにかく、元の質問に戻り、私はResharperを使用しませんが、「var」を使用しない場合を検出するのに十分スマートであると思います。:-)


4
不必要なキャスト(を使用as)はまったくひどいです。Animal x = new Cat(); DoStuffWithDog(x as Dog); なぜxを再利用するのかなどの問題がある場合は、コンパイルエラーをランタイムエラーに変えます。犬x = new Dog()、猫y = new Cat()、可能性のある曖昧さがなくなりました。
Mark Sowul 2013

キャスト(「as」ありまたはなし)すると、実行時エラーが発生する可能性があります。自分が何をしているのかわかっているときに、キャストについて「ひどい」とは何ですか?なぜxを再利用するのですか?ここの例は説明のためのものです。この例の目的は、参照が多態的であることを意図している場合に、「var」を使用するとどのように制限が生じるかを示すことです。
xtrem 2014年

5
いいえ、できません。ポリモーフィズムは、ここで行われていることの逆です。これは、型のオブジェクトを渡すようにしようとしているAnimal取るメソッドにDogCat。多型は逆である:あなたがタイプのオブジェクト渡すことができるようにDogし、Catかかる方法にAnimal例えばを、void Walk(Animal a)Walk(new Cat())Walk(new Dog())
マーク・Sowul

この方法で変数を再利用しないでください。非常に厄介なバグが発生します。短いメソッドではそれほど明白ではありませんが、15〜20行のコードがあると、xが何であるかを忘れてしまいます。怠惰にしないでください:var dog = new Dog(); DoStuff(dog); var cat = new Cat(); DoStuff(cat);
user3285954 2015

2
戦いなし。変数を宣言するどちらの方法(暗黙的または明示的)についても感じません。私は実際には、ほとんどの毎日の少なくとも1つを使用します。暗黙の(var)メソッドを選択すると、コンパイラーが可能な限り狭いタイプを決定することを強調しておきます。それは必ずしもあなたが望むものではないかもしれません。それで全部です。
xtrem 2015

2

私の見解でvarは、変数の値を定義するときにタイプが何であるかがすぐに明らかな場合にのみ使用する必要があります。

例:

var s = "string value";

ことは明らかであるsですstring

変数の型名が非常に複雑な場合にも適していると思います。

例:

Dictionary<SomeCustomKeyType, Dictionary<AnotherCustomKeyType, List<int>>> dict = new Dictionary<SomeCustomKeyType, Dictionary<AnotherCustomKeyType, List<int>>>();

// This is a little easier to read than the above statement
var dict = new Dictionary<SomeCustomKeyType, Dictionary<AnotherCustomKeyType, List<int>>>();

これらのシナリオ以外では、を使用して作成されるGAINはありませんvarが、有害になる可能性があるいくつかのシナリオを考えることができます。

たとえば、右側の変数値がタイプを明確に示さない使い捨てタイプです。IDisposableの破棄は簡単に忘れられます

例:

// returns some file writer
var wr = GetWriter();

wr.add("stuff");
wr.add("more stuff");

//...
//...

// Now `wr` needs to be disposed, 
// but there is no clear indication of the type of `wr`,
// so it will be easily overlooked by code writer and code reviewer.

1

'var'は、コードに一種の「動的」要素を追加します(もちろん、コードは厳密に入力されたままです)。タイプが明確でない場合は使用しないことをお勧めします。この例を考えてみましょう:

var bar = GetTheObjectFromDatabase();
bar.DoSomething();

ClassA {
  void DoSomething() {
  //does something
  }
}

ClassB {
  void DoSomething() {
  //does something entirely different
  }
}

GetTheObjectFromDatabase()の戻りのTypeがType AからBに変更されても、どちらのクラスもDoSomething()を実装しているため、気付かないでしょう。ただし、コードは実際にはまったく別のことを行う場合があります。

これは両方が異なるものをログに書き込むのと同じくらい微妙な場合があるので、ユニット化が遅すぎることに気付かないかもしれません。

次のvarの使用は常に問題ありません。

var abc = new Something();

1

「var」の継続的な使用を嫌う人のために、「変数の導入」を行うときにReSharperがデフォルトでvarになるのを停止することもできます。これは長い間私を苛立たせたものであり、常にデフォルトでvarになっていて、毎回それを変更していました。

これらの設定は、[コード編集]> [C#]> [コードスタイル]にあります。

ここに画像の説明を入力してください


0

技術的な違いはありません(eWolfが指摘したとおり)。どちらを使用しても、生成されたCLRコードは同じように見えます。

私の意見では、主な利点は、これにより、より適切な変数の命名を使用せざるを得なくなることです。あなたの例では、変数名として 'foo'はかなり悪い選択です。


0

JetBrains(ReSharperの作者)によると、デフォルトではvarの使用を推奨しています。

彼らのウェブサイトから:

varC#3.0で導入された暗黙的に型付けされたローカル変数(キーワードとも呼ばれる)を使用することは、多くのシナリオで読みやすさが向上するため、非常に人気があります。デフォルトでは、ReSharperはvarキーワードの使用も推奨しますが、その使用方法の設定は柔軟に構成可能です。たとえば、特定のケースまたはどこでも明示的なタイプを使用することを選択でき、ReSharperは設定の適用を支援します。


明示的な型宣言が必要な場合はどこで構成できますか?
user764754 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.