質問

var キーワードは、明示的な必要性を排除します。型宣言と私が興味を持って読んだ SOの議論適切。

ブーについても読んだことがあります(使用されていません)。 ローカル変数を宣言するオプションにすることで、さらに一歩進んでください。 Booでは、型と宣言の両方を暗示できます。

C#言語の設計者が、なぜvarキーワードを含めることに煩わされたのでしょうか?

更新:はい、varは匿名型をサポートしていますが、匿名型自体はvarキーワードを必要としません...

var anon = new { Name = "Terry", Age = 34 };

anon = new { Name = "Terry", Age = 34 };
役に立ちましたか?

解決

更新:ここには、2つの関連する質問があります。実際には: 1.なぜ変数を宣言する必要があるのですか? 2.「var」とは何ですか変数を宣言させる言語で

(1)への回答は多数あり、この質問については他の場所で見つけることができます。 (2)に対する私の答えは以下のとおりです。

他のコメンターが言ったように、LINQは匿名型にこれを使用します。ただし、実際にはLINQは、式の右辺の型がプログラマーに知られていないか、非常に冗長な、より一般的な問題のインスタンスです。考慮:

SomeGeneric<VeryLongTypename<NestedTypename>> thing = new   
SomeGeneric<VeryLongTypename<NestedTypename>>();

冗長でエラーが発生しやすいでしょう?だから今、彼らはあなたにこれをさせる:

var thing = new SomeGeneric<VeryLongTypename<NestedTypename>>();

情報の重複を減らすことにより、エラーが排除されます。ここで入力エラーだけではないことに注意してください:コンパイラが左から右に静かにキャストできるように、左辺の式のタイプが誤って入力される可能性がありますが、キャストは実際にはいくつかのプロパティを失います右辺値。これは、右辺値によって返される型が不明または匿名である場合にさらに重要です。

他のヒント

varキーワードがないと、既存の変数を実際に使用するつもりだったときに、誤って新しい変数を作成することができます。例:

name = "fred";
   ...
Name = "barney"; // whoops! we meant to reuse name

varの必要性を理解しており、それが目的に大きく貢献しています。キーワードを持たず、型なしでその場で変数を定義するだけでは怖いです。 1年以上触れていないコードを修正する必要がある場合、コードまたは自分を保守しなければならない次の人を傷つけます。それがC#で開くべきドアかどうかはわかりませんが、varが必要でないときに使いすぎると読みやすさの問題が既に発生しているのではないかと思います。

最近見たほとんどすべての.net 3.5の例には、varで定義されたすべての変数があります。

私が主張するのは、使いすぎたときにキーストロークを節約するために、読みやすさを本当に犠牲にしているということです。例:

// What myVar is, is obvious
SomeObject myVar = new SomeObject();

// What myVar is, is obvious here as well
var myVar = new SomeObject();

私が見る問題は、人々がどこでもそれを使用していることです...例えば:

// WTF is var without really knowing what GetData() returns?
// Now the var shortcut is making me look somewhere else when this should
// just be readable!
var myVar = GetData();

// If the developer would have just done it explicitly it would actually
// be easily readable.
SomeObject myVar = GetData();

次の引数は、関数に名前を付けるだけです...

var weight = GetExactWeightOfTheBrownYakInKilograms();

まだ何が戻ってくるのかわかりません。それはint、decimal、float、weightオブジェクトですか?私はまだそれを調べる時間を無駄にしなければなりません...怠...なプログラミングから一日を節約するためにインテリセンス松葉杖が必要です。関数名に戻り値の型を含めることもできます。良いアイデアです。現在、varを使用しても、すべての関数に実際の長い名前を付けること以外は何も節約できません。

人々はvarの使用を終えたばかりで、遅延プログラミングにつながり、コードを読みにくくしています。キーワードvarを入力するたびに、明示的ではなく使用する正当な理由が必要です。

これは少し主観的ですが、C#3.0を設計して&var; var;キーワードを指定せずに暗黙的に型指定された変数のキーワードを使用すると、コードが読みやすくなります。たとえば、次の最初のコードブロックは2番目のコードブロックより読みやすいです。

変数が宣言されている場所は明らかです:

var myVariable = SomeCodeToSetVariableHere;
myVariable = SomeOtherCodeTOSetVariable;

変数が宣言されている場所がわからない:

myVariable = SomeCodeToSetVariableHere;
myVariable = SomeOtherCodeTOSetVariable;

これらは過度に単純化した例です。これがどこに行くかわかると思います。複雑な状況では、変数が実際に定義されている場所を見つけることができると便利かもしれません。

あなたの質問では、 var はコンパイラーに anon という単語が合法であることを伝えることでコードに値を追加します。割り当てに含まれるタイプ。このようなコンパイラーへの名前の導入を要求することで、コンパイラーは明示的に許可されていないことをコンパイラーが拒否できるようになり、それによりコンパイル時に特定の種類のエラーをキャッチし、実行時に爆発しないようにします。

たとえば、質問の更新セクションで、このスニペットについて尋ねました:

anon = new { Name = "Terry", Age = 34 };

この方法で許可することの問題は、それが本当にタイプミスであったとしても、名前が以前に存在しなかった割り当ての左側のすべてを変数宣言に変えることです。プログラムの後半で別の何かをanonに割り当て、さらに新しい値を参照するが、真ん中のステートメントにタイプミスがあった場合、実行時まで現れない問題があります。

あなたの応答は、Booがそれを行うということです。したがって、それは大丈夫であるか、少なくとも可能でなければなりません。しかし、それはニシンです。 BooではなくC#について話している。 C#の目的の1つは、コンパイラができるだけ多くのエラーをキャッチできる言語を持つことです。 Booもそれを望んでいますが、Pythonのようになりたいとも考えています。そのため、Pythonのような構文と引き換えに、C#のコンパイル時の安全性の一部(すべてではない)を犠牲にします。

免責事項:私の例はJavaですが、それは私が知っていることですが、概念は同じでなければなりません。

重要だと思う答えに投票しました(誤って新しい変数を作成するのは簡単すぎます)。

bill=5;
bi11=bill+5

請求書の価値は?

とはいえ、入力するのは時々いらいらすることがあります:

DataOutputStream ds=new DataOutputStream();

冗長なように見えますが、正直なところ何も問題はありません。 2回入力する必要がなくなり、非常に役立ちます。時間がかかるのは、質問があるとき、つまりAPIの使い方だけがわからないときです。その型宣言を2回入力するのが本当に面倒な場合、なぜここで時間を無駄にしているのですか?これを読み始めたので、次の2週間に必要なすべての宣言に十分な30または40の宣言を入力することができました。

繰り返しを繰り返すことで生じる感情的なストレスは理解できますが、よりインテリジェントなツールを作成するための一貫性、明快さ、および能力はそれだけの価値があると思います。

もう1つ、ほとんどの場合、コードは上記の例のようにはなりません。あなたがすべきことはこれです:

DataOutput ds=new DataOutputStream();

これにより、テンプレートに具体的なクラスを使用しているという事実がすぐに隠されます。そのテンプレートは、クラスで必要なすべての操作を実行できる必要があります。後でdsを他の種類の出力ストリームに置き換えたい場合は、その単一行を変更するだけで修正されます。 DataOutputStreamにキャストすることでDataOutputで利用できない機能を使用している場合、エディターはそれを簡単に把握して通知します。

特にLINQをサポートする匿名型の場合。

http://www.blackwasp.co.uk/CSharpAnonTypes.aspx

var(および他のいくつかの新しいキーワード)は、Linqをサポートするために特別に追加されたと思います。

varは、匿名タイプの作成に使用されるキーワードです- http:/を参照してください/msdn.microsoft.com/en-us/library/bb397696.aspx

匿名型は、Linq以外の場所で使用できます。

varはLinqにとって非常に便利です。実際、ある専門家の著者によると、&quot; &#8216; var&#8217;がなければ、LINQを使用するのは苦痛になります。&quot;

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top