49

varキーワードは、明示的な型宣言の必要性をなくします。それが適切な場合についての SO の議論を興味深く読みました

また、ローカル変数の宣言をオプションにすることで、さらに一歩進んでいるように見える(しかし使用されていない) Booについても読みました。Boo を使用すると、型と宣言の両方を暗示できます。

なぜ C# 言語の設計者はわざわざ var キーワードを含めたのでしょうか?

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

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

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

9 に答える 9

48

var キーワードがないと、実際には既存の変数を使用するつもりだったときに、誤って新しい変数を作成する可能性があります。例えば

name = "fred";
   ...
Name = "barney"; // whoops! we meant to reuse name
于 2008-10-16T16:04:35.973 に答える
46

更新:実際には、関連する 2 つの質問があります: 1. なぜ変数を宣言しなければならないのですか? 2. 変数を宣言する言語で「var」はどのような用途に使用されますか?

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

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

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

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

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

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

于 2008-10-16T16:12:16.660 に答える
41

私は 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 を入力するたびに、明示的ではなく、なぜそれを使用するのかという正当な理由が必要です。

于 2009-04-29T22:27:09.173 に答える
6

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

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

var myVariable = SomeCodeToSetVariableHere;
myVariable = SomeOtherCodeTOSetVariable;

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

myVariable = SomeCodeToSetVariableHere;
myVariable = SomeOtherCodeTOSetVariable;

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

于 2008-10-16T16:06:34.660 に答える
5

あなたの質問では、割り当てで暗示されたタイプのアイテムが表示されると予想される場所でvar単語が使用できるようになったことをコンパイラに伝えることで、コードに価値を追加します。anonこのようにコンパイラに名前の導入を要求することで、コンパイラは明示的に許可されていないものを拒否できるようになり、コンパイル時に特定の種類のエラーをキャッチして実行時に爆発しないようにすることができます。

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

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

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

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

于 2008-10-16T16:54:36.390 に答える
3

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

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

bill=5;
bi11=bill+5

請求書の価値は?

とはいえ、次のように入力するのは少しイライラすることがあります。

DataOutputStream ds=new DataOutputStream();

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

私は、同じことを繰り返すことで精神的ストレスが生じることは理解していますが、一貫性、明快さ、よりインテリジェントなツールを作成する能力により、それだけの価値があると言っているのだと思います。

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

DataOutput ds=new DataOutputStream();

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

于 2008-10-16T16:26:02.890 に答える
0

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

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

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

var は Linq にとって非常に便利です。実際、ある専門家の著者によると、「「var」がなければ、LINQ は使いづらくなります。

于 2008-10-16T16:01:07.293 に答える
-1

とりわけ LINQ をサポートする匿名型の場合。

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

于 2008-10-16T16:01:37.463 に答える