225

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

int、などの単純なタイプでも同様boolです。

なぜこれが推奨されているのですか?私はコンピューター サイエンスや .NET のバックグラウンドを持っていないので、最近 .NET 開発に "陥った" ので、何が起こっているのか、それが有益かどうかを知りたいと思っています。

4

23 に答える 23

294

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

var obj = new SomeObject();

タイプが明らかでない場合は、むしろそれを書き出す必要があります。

SomeObject obj = DB.SomeClass.GetObject(42);
于 2009-12-09T13:29:59.340 に答える
198

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

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

また

var dictionary = new Dictionary<int, MyLongNamedObject>();
于 2009-12-09T13:26:32.110 に答える
101

個人的には、この提案をオフにすることを好みます。を使用varすると、読みやすさが向上することがよくあります。しかし、あなたが述べたように、それは時々それを減らします(単純な型の場合、または結果の型がobscureの場合)。

私は使うvarときと使わないときを選ぶのが好きです。しかし、繰り返しますが、それは私だけです。

于 2009-12-09T13:28:30.047 に答える
70

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 がデフォルトでそれを使用するのはなぜですか? 状況のニュアンスを解析して、いつ使用しないのが最適かを判断できないため、簡単にすることをお勧めします。

于 2013-03-02T06:39:12.383 に答える
26

「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より包括的なキーワード使用するのが好きです。しかし、私はまた、型にちなんで変数に名前を付ける傾向があるので、実際に情報を失うことはありません.

とはいえ、状況によっては例外を設けることもあります。これは複雑なものの性質であり、ソフトウェアは複雑ではありません。

于 2016-01-08T18:22:20.970 に答える
24

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

AVeryLongTypeName myVariable = new AVeryLongTypeName( arguments );

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

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

于 2011-03-11T06:24:10.150 に答える
18

これも嫌いでした。

これが の使用に関する議論に発展することを望んでvarいません。用途はありますが、どこでも使用するべきではありません。

覚えておくべき重要なことは、ReSharper は任意のコーディング標準に合わせて構成されているということです。

編集:ReSharperとvar

于 2009-12-09T13:28:55.160 に答える
16

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

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

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

行き方をご説明します。

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

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

ここに画像の説明を入力

ReSharper ヘルプ ドキュメント:コード構文スタイル: 暗黙的/明示的タイピング ('var' キーワード) — 'var' キーワードを使用する設定を構成する

于 2015-04-08T15:02:36.510 に答える
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();
    
于 2015-04-14T02:00:10.073 に答える
6

ReSharper はvar、オブジェクトの作成を整理する傾向があるため、推奨しています。

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

StringBuilder bld = new StringBuilder();

var bld = new StringBuilder();

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

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

于 2009-12-09T13:29:46.550 に答える
6

ところで、ReSharper は、「この提案をコードに適用することをお勧めします」と「コードが壊れています。修正してほしいですか?」を区別しています。キーワードは、 「var入れ子を減らすために反転する」などの提案カテゴリにあります。それに従う必要はありません。

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

于 2009-12-09T13:32:03.813 に答える
5

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

于 2009-12-09T13:29:57.810 に答える
2

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

var x = 1;

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

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

var x = 1; --> var x = "hello";
int x = 1; --> string x = "hello";
于 2009-12-09T13:27:27.083 に答える
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 リファレンス

于 2009-12-09T13:32:17.247 に答える
2

オブジェクト型を明示的に指定するのは、なんとなく冗長です。英語に翻訳したとしても、「型 X のオブジェクトを型 X の変数に入れる」対「型 X のオブジェクトを変数に入れる」は冗長に聞こえます。

ただし、「var」の使用には制限があります。純粋な美しさである以下のポリモーフィズムの使用を防ぎます。

犬が動物を拡張するとします。Cat は Animal クラス階層を拡張します。

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

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

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

「var」で宣言された x を含む同じコードはコンパイルされません

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」を使用しないタイミングを検出するのに十分スマートであると想定しています。:-)

于 2013-01-27T06:57:27.383 に答える
1

For those that dislike the constant use of "var", you can also stop ReSharper from defaulting to var when doing "introduce variable". This was something that frustrated me for a long time, it was always defaulting to var, and I was changing it every time.

These settings are under Code Editing > C# > Code Style

enter image description here

于 2016-01-25T11:13:06.923 に答える
0

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

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

C# 3.0 で導入された暗黙的に型指定されたローカル変数 (キーワードとも呼ばれますvar) の使用は、多くのシナリオで読みやすさが向上するため、非常に一般的になりました。デフォルトでは、ReSharper はvarキーワードの使用も推奨しますが、その使用方法の設定は柔軟に構成できます。たとえば、特定のケースまたはあらゆる場所で明示的な型を使用することを選択でき、ReSharper は設定を強制するのに役立ちます。

于 2016-10-03T18:22:41.060 に答える
0

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

私の意見では、主な利点は、これにより、より適切な変数命名を使用するように強制される傾向があることです。あなたの例では、「foo」は変数名の選択としてはかなり不適切です。

于 2009-12-09T13:36:25.257 に答える