変数データ型を明示的に定義するか、キーワード「var」を使用しますか?[閉まっている]


35

C#では、すべての変数宣言に汎用のvarキーワードを使用することをお勧めしますか?はいの場合、次のステートメントの10進数のMなど、変数宣言内のリテラル値にこれらの特殊文字を記載する必要がありますか?

var myDecimal = 14.5M;

それが違いを生むなら、私はC#でWeb開発をしようとしています。


7
SO(それが私見に属している場所)で12個の重複があります。

1
同じ質問が、C ++ 0xの目的変更を伴うC ++にも現れていautoます。
デビッド

5
最近、このについてブログC#コンパイラチームのエリックリペット:blogs.msdn.com/b/ericlippert/archive/2011/04/20/...
ティム・グッドマン

この質問には60億の詐欺師がいます。
DeadMG

@DeadMGで60億と1になります。
wassimans

回答:


53

varの使用に関して多くの論争がありました。私の一般的なルールは次のとおりです。

  • 割り当ての右手がコンストラクターである場合など、タイプが明らかな場合は、varを使用します。
  • LINQクエリ(最初のvarの理由)など、型が複雑な場合はvarを使用します。
  • 変数が正しく入力されていることを確認したい両価型(例としてDecimal)の場合、それを綴ります。
  • 匿名型はvarを使用する必要があります。
  • 他のすべての場合、タイプを綴ります。

基本的に、目標はコードを読みやすくすることです。割り当てが明らかであるため、varで十分だと思われる場合は、varを使用します。必要だと感じたときに、読者にヒントとして完全なタイプ名を使用します。


9
またforeach、必ずしも各アイテムのタイプではなく、コレクションの列挙のみを考慮したステートメントで「var」を使用します。
アダムリア

1
ジェシーが匿名型を指摘したように;)
マイケルブラウン

4
@AnnaLearは時々気にしなければならないこともあります。この場合、foreach(datatable.Rowsのvar row)は、予想されるDataRowではなくオブジェクトです。
サノスパパタナシオ

@ThanosPapathanasiouはい、そうです。Windows FormsのControlsコレクションや他の状況でも同じことが言えます。
アダムリア

私は通常、変数の型を確認したい場合を除いてvarを使用します(たとえば、値が2倍であることを確認したい場合など)
eka808

14

使用する場合varは、プログラミングの「聖戦」です。必要な場所は1つだけです。操作の結果が次のような匿名型を作成する場合です。

var result = new { Name = "John", Age = 35 };

それ以外の場所では、オプションであり、他の状況で使用するかどうかは、コーディング標準次第です。

そして、はい、コンパイラーがそれが右側にあることをコンパイラーに知らせるために、リテラルの特殊文字が必要になります。あなたの例では、なしMで、デフォルトはdoubleではなくですdecimal


1
匿名型についてのすべてを忘れました!
マイケルブラウン

私の最後の仕事で、「var」キーワードを使用し続けると解雇されると言われました
...-hanzolo

それは極端ですが、あなたの会社のイニシアチブです。しかし、それがあなたの「最後の」仕事だとうれしいです!:)
ジェシーC.スライサー

7

MSDNから

ただし、varを使用すると、少なくとも他の開発者がコードを理解しにくくなる可能性があります。そのため、C#のドキュメントでは通常、必要な場合にのみvarを使用しています。

暗黙のタイピングは本当に好きではありません。表面的にはコードを読みやすくする傾向がありますが、将来的には多くの問題を引き起こす可能性があります。開発者が変数初期化子を変更した場合、たとえば

var myFloat=100f;

var myFloat=100;

または

var myFloat=100.0;

タイプが変更されると、コンパイラエラーが大量に発生するか、Webビューにあり、ビルド後のステップを使用してビューをプリコンパイルしていない場合、効果なしではキャッチされないランタイムエラーが大量に発生します展開前のテスト。

暗黙的なタイピングもどこでも機能しません(同じMSDNリンクから)

varは、ローカル変数が同じステートメントで宣言および初期化されている場合にのみ使用できます。変数をnull、メソッドグループ、または匿名関数に初期化することはできません。

varは、クラススコープのフィールドでは使用できません。

varを使用して宣言された変数は、初期化式では使用できません。つまり、この式は有効です。inti =(i = 20); しかし、この式はコンパイル時エラーを生成します。var i =(i = 20);

複数の暗黙的に型指定された変数は、同じステートメントで初期化できません。

varという名前の型がスコープ内にある場合、varキーワードはその型名に解決され、暗黙的に型指定されたローカル変数宣言の一部として扱われません。

コードの一貫性を保つ(この場合、どこでも明示的な型指定を使用する)ことは、非常に良いことです。私の意見でvarは、怠isであり、本当の利点はありません。また、すでに複雑なプロセスでさらに別の潜在的な障害点をもたらします。

2017アップデート

私は完全に考えを変えました。C#で作業するときvarは、ほとんどの時間を使用します(インターフェイス型変数などを除く)。コードを簡潔に保ち、読みやすさを向上させます。それでも、解決されたタイプが実際に何であるかに注意してください。


@ 3Dave、何があなたの心を変えたか疑問に思います。私はまだあなたの元のポイントに100%同意します:「varは怠zyであり、本当の利点を提供せず、すでに複雑なプロセスでさらに別の潜在的な障害点をもたらします」。
ダン

@Danそれは本当に読みやすさに落ちました。有能な開発者であれば、宣言の初期化側に何があるかを問題なく非常に迅速に判断できます。this.どこでも使わない、またはのSystem.Blah.SomeType代わりに言うのと同じようにusing、それでも信じられないほど面倒な、より簡潔なコードは-少なくとも私にとって-通常は視覚的に解析しやすいです。明示的な型指定が正しい選択であるシナリオはまだ多くあります。しかし、最近では、きれいなコードを外に出そうとしている人ほど、言語弁護士ではありません。
3Dave

@Dan(もちろん、私もusing namespace std;.cppファイルで使用している人です(ヘッダーではありません。タールや
フェザリング

3

C#リファレンスでは、この構成の優れた使用法と悪い使用法を説明するために以下を示しています。

次の例は、2つのクエリ式を示しています。最初の式では、varの使用が許可されていますが、クエリ結果の型はIEnumerableとして明示的に指定できるため、必須ではありません。ただし、2番目の式では、結果は匿名型のコレクションであり、その型の名前はコンパイラ自体を除いてアクセスできないため、varを使用する必要があります。例2では、​​foreach反復変数項目も暗黙的に入力する必要があることに注意してください。

 // Example #1: var is optional because 
    // the select clause specifies a string 
    string[] words = { "apple", "strawberry", "grape", "peach", "banana" };
    var wordQuery = from word in words
                    where word[0] == 'g'
                    select word;

    // Because each element in the sequence is a string,  
    // not an anonymous type, var is optional here also. 
    foreach (string s in wordQuery)
    {
        Console.WriteLine(s);
    }

    // Example #2: var is required because 
    // the select clause specifies an anonymous type 
    var custQuery = from cust in customers
                    where cust.City == "Phoenix" 
                    select new { cust.Name, cust.Phone };

    // var must be used because each item  
    // in the sequence is an anonymous type 
    foreach (var item in custQuery)
    {
        Console.WriteLine("Name={0}, Phone={1}", item.Name, item.Phone);
    }

0

varキーワードは、コンパイラにvar型変数の型を自動的に推測することのみを要求します。したがって、10進型変数をvar変数に格納する場合は、mを使用する必要があります。同様に、文字列を保存する場合は、引用符で囲む必要があります。


0

私にとって、私は次の場合にvarを使用しません:

  • 変数の型を確認したいとき(たとえば、使用されている型が10進数ではなく2倍であることを確認したい場合、これは大いに信頼できます!)
  • のような多態性コードFruit foo = new Apple();。この場合、varは回避し、親クラス(ここではFruit)を使用する方が、コードロジックと起こりそうなバグの制限をよりよく理解することにより優れていると思います(varでは、ポリモーフィックコンセプトのチェックなし!)

残りについては、ケースと開発者の背景に依存すると思います。PHPの世界の一部の人々は変数の型を気にしないことを好み、Javaの世界の一部の人々はvarが異端であり、冗長であるほど良いと考えるでしょう。

あなたの個人的な意見をする必要があります:)

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