C#では、すべての変数宣言に汎用のvarキーワードを使用することをお勧めしますか?はいの場合、次のステートメントの10進数のMなど、変数宣言内のリテラル値にこれらの特殊文字を記載する必要がありますか?
var myDecimal = 14.5M;
それが違いを生むなら、私はC#でWeb開発をしようとしています。
auto
ます。
C#では、すべての変数宣言に汎用のvarキーワードを使用することをお勧めしますか?はいの場合、次のステートメントの10進数のMなど、変数宣言内のリテラル値にこれらの特殊文字を記載する必要がありますか?
var myDecimal = 14.5M;
それが違いを生むなら、私はC#でWeb開発をしようとしています。
auto
ます。
回答:
varの使用に関して多くの論争がありました。私の一般的なルールは次のとおりです。
基本的に、目標はコードを読みやすくすることです。割り当てが明らかであるため、varで十分だと思われる場合は、varを使用します。必要だと感じたときに、読者にヒントとして完全なタイプ名を使用します。
foreach
、必ずしも各アイテムのタイプではなく、コレクションの列挙のみを考慮したステートメントで「var」を使用します。
使用する場合var
は、プログラミングの「聖戦」です。必要な場所は1つだけです。操作の結果が次のような匿名型を作成する場合です。
var result = new { Name = "John", Age = 35 };
それ以外の場所では、オプションであり、他の状況で使用するかどうかは、コーディング標準次第です。
そして、はい、コンパイラーがそれが右側にあることをコンパイラーに知らせるために、リテラルの特殊文字が必要になります。あなたの例では、なしM
で、デフォルトはdouble
ではなくですdecimal
。
ただし、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
は、ほとんどの時間を使用します(インターフェイス型変数などを除く)。コードを簡潔に保ち、読みやすさを向上させます。それでも、解決されたタイプが実際に何であるかに注意してください。
this.
どこでも使わない、またはのSystem.Blah.SomeType
代わりに言うのと同じようにusing
、それでも信じられないほど面倒な、より簡潔なコードは-少なくとも私にとって-通常は視覚的に解析しやすいです。明示的な型指定が正しい選択であるシナリオはまだ多くあります。しかし、最近では、きれいなコードを外に出そうとしている人ほど、言語弁護士ではありません。
using namespace std;
.cppファイルで使用している人です(ヘッダーではありません。タールや
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);
}
varキーワードは、コンパイラにvar型変数の型を自動的に推測することのみを要求します。したがって、10進型変数をvar変数に格納する場合は、mを使用する必要があります。同様に、文字列を保存する場合は、引用符で囲む必要があります。
私にとって、私は次の場合にvarを使用しません:
Fruit foo = new Apple();
。この場合、varは回避し、親クラス(ここではFruit)を使用する方が、コードロジックと起こりそうなバグの制限をよりよく理解することにより優れていると思います(varでは、ポリモーフィックコンセプトのチェックなし!)残りについては、ケースと開発者の背景に依存すると思います。PHPの世界の一部の人々は変数の型を気にしないことを好み、Javaの世界の一部の人々はvarが異端であり、冗長であるほど良いと考えるでしょう。
あなたの個人的な意見をする必要があります:)