web-dev-qa-db-ja.com

変数のデータ型を明示的に定義するか、キーワード 'var'を使用するか?

C#では、すべての変数宣言に多目的varキーワードを使用することをお勧めしますか?はいの場合、次のステートメントで、10進数のMのように、変数宣言内のリテラル値の特殊文字について言及する必要がありますか。

var myDecimal = 14.5M;

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

35
wassimans

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

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

基本的に、目標はコードを読みやすくすることです。割り当てが明らかであるため、varで十分だと思われる場合は、varを使用してください。必要な場合は、完全な型名をリーダーのヒントとして使用してください。

54
Michael Brown

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

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

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

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

14
Jesse C. Slicer

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はレイジーであり、本当のメリットはありません。また、すでに複雑なプロセスに、もう1つの潜在的な障害ポイントをもたらします。

2017年の更新

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

7
3Dave

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

次の例は、2つのクエリ式を示しています。最初の式では、クエリ結果のタイプをIEnumerableとして明示的に宣言できるため、varの使用は許可されていますが、必須ではありません。ただし、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);
    }
3

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

0

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

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

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

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

0
eka808