質問

この質問にはすでに答えがあります:

これは、プログラミングをするときに私がいつも疑問に思うことです。コードを記述するときに何を使用するか:

var myFiles = Directory.GetFiles(fullPath);

または

string[] myFiles = Directory.GetFiles(fullPath);

変数 新しいです、そして 暗黙的に型指定されたローカル変数, 、そのため、ローカルでのみ使用でき、null にすることはできないなどのルールがありますが、「通常」に使用することに利点があるかどうかは疑問です。

「通常」の部分は、そうではありません 匿名型, オブジェクトとコレクションの初期化子 そして クエリ式 var 匿名オブジェクトを使用する意図はどこにあるのでしょうか、つまり、私が言いたいのは...上の例と同じように。

あなたの考えは何ですか?

役に立ちましたか?

解決

明らかな使用を超えて、 var LINQ では、読みやすくするために複雑な変数宣言を省略するためにも使用します。例:

var d = new Dictionary<string, Dictionary<string, Queue<SomeClass>>>();

一般に、私は静的型付けからある種の安心感を得て (もっと良い言葉が見つかりませんが)、静的型付けをやめたくなくなります。変数を宣言しているときに、自分が何をしているのかわかっているという感覚が気に入っています。変数の宣言は、コンパイラーに何かを伝えるだけではなく、コードを読む人に何かを伝えることになります。

例を挙げてみましょう。を返すメソッドがあるとします。 List<string>. 。このコードは確かに正しく、C# 開発者の 90% がおそらく次のように記述すると思います。

List<string> list = MyMethod();

当然ですよね?実は、同じくらい簡単に使える場所があるんです var.

確かにそうです。しかし これ コードのバージョンは単に変数を宣言しているだけではなく、コードを書いた人が何をしようとしているのかを示しています。

IEnumerable<string> list = MyMethod();

そのコードを書いた開発者は私に、「このリストを変更するつもりはありませんし、そのメンバーにアクセスするためにインデックスを使用するつもりもありません。私がやろうとしているのは、それを反復処理することだけです。」これは、1 行のコードで伝えるには非常に多くの情報です。使ったら諦めるものだよ var.

もちろん、最初から使用していなかったとしても、それをあきらめるわけではありません。あなたがそのコード行を書くタイプの開発者であれば、次のコードを使用しないことをすでに知っているでしょう。 var そこには。

編集:

Jon Skeet の投稿を読み直したところ、Eric Lippert の次の言葉が目に留まりました。

暗黙的に型付けされたローカルは、「どのように」を強調せず、それによって「何を」を強調できる小さな方法の 1 つにすぎません。

実際、多くの場合、暗黙的な型付けを使用すると、暗黙的なものが残ることになると思います。「何を」にこだわらなくても大丈夫です。たとえば、次のような LINQ クエリを何気なく書いてみます。

var rows = from DataRow r in parentRow.GetChildRows(myRelation)
           where r.Field<bool>("Flag")
           orderby r.Field<int>("SortKey")
           select r;

そのコードを読んでいるときに私が思うことの 1 つは、「rows です IEnumerable<DataRow>." なぜなら、LINQ クエリが返すものは次のとおりであることを知っているからです。 IEnumerable<T>, 、選択されているオブジェクトのタイプがそこに表示されます。

それは何の場合です していない 明らかにされました。それは私の推測に委ねられています。

さて、私が LINQ を使用するケースの約 90% では、これは少しも問題になりません。90% の確率で、コードの次の行は次のようになります。

foreach (DataRow r in rows)

しかし、宣言することが非常に役立つコードを想像するのは難しくありません。 rows として IEnumerable<DataRow> - さまざまな種類のオブジェクトがクエリされるコード。反復の隣にクエリ宣言を置くのは現実的ではありませんでした。検査できると便利です。 rows インテリセンス搭載。そして、それは「何を」するかということであり、「方法」ではありません。

他のヒント

「var Everywhereを使用する」から「基本的に必要な匿名タイプのVARのみを使用する」まで、これについて多種多様な意見が得られます。好き エリック・リッパートの見解:

すべてのコードは抽象化です。コードが「本当に」しているのは、データの操作ですか?いいえ。数字?ビット?いいえ。電圧?いいえ。電子?はい、しかし、電子のレベルでコードを理解することは悪い考えです!コーディングの芸術は、聴衆にとって適切なレベルの抽象化が何であるかを考えています。

高レベルの言語では、コードが(意味的に)行うことと、コードがそれを達成する方法との間に、常にこの緊張があります。メンテナンスプログラマーは、変更を加えることに成功する方法と方法の両方を理解する必要があります。

LINQの全体的なポイントは、「方法」を大幅に強調し、「何」を大きく強調することです。クエリの理解を使用することにより、プログラマーは将来の視聴者に「この結果セットがどのように計算されているかを正確に知ることも気にするべきではないと信じていますが、結果のセットの意味論が何であるかについて非常に気にする必要があります。」彼らは、コードを実装されているビジネスプロセスに近づけ、それを作るビットと電子から遠くにします。

暗黙のうちにタイプされた地元の人々は、あなたがどのように強調し、それによって何を強調することができる小さな方法の1つにすぎません。それが特定のケースで行うのが正しいことであるかどうかは、判断コールです。したがって、タイプの知識が関連性があり、その選択がメソッドの継続的な操作に重要である場合、暗黙のタイピングを使用しないことを人々に伝えます。明示的なタイピングでは、「これが理由でどのように機能し、注意を払っているかを教えてくれます」と書かれています。暗黙のタイピングは、「このことがリストであるか顧客であるかは少し重要ではありません[]、重要なのは、それが顧客のコレクションであるということです。」

個人的にはそうではありません 傾向がある 型がそれほど明白ではない場合にそれを使用します。ここでは、LINQ クエリを「かなり明白」なものとして含めます。そのためにはやりたくない Directory.GetFiles たとえば、それが を返すかどうかはあまり明らかではないため、 string[] (言う)の代わりに FileInfo[] (またはまったく別のもの) - そしてそれは、後で行うことに大きな違いをもたらします。

代入演算子の右側にコンストラクター呼び出しがある場合、私はこれを使用する可能性が高くなります。 var:タイプが何になるかは明らかです。これは、複雑なジェネリック型の場合に特に便利です。 Dictionary<string,List<int>>.

個人的に私は var を 2 か所でのみ使用します。

  1. 匿名型の場合、つまり。LINQ 関連 (場合によっては var が必要)
  2. ステートメントが同じ型で特定の型を宣言および構築する場合

つまり。これはポイント 2 の例です。

var names = new List<String>();

編集済み:これは Jon Skeet の質問に対する答えです。

上記の答えは実際には簡略化されています。基本的に私が使っているのは、 変数 ここで、タイプは次のいずれかです。

  1. 知る必要はありません(それほど多くの場所ではありませんが)
  2. 知ることが不可能 (LINQ、匿名型)
  3. それ以外の場合は既知であるか、コードから明らかでない

ファクトリ メソッドの場合、コードを記述する時点で知っておく必要があるのは、返されるオブジェクトが何らかの型の子孫であることだけです。 ある種の 静的ファクトリーメソッドがある場合は、使用します 変数. 。このような:

var connection = DatabaseConnection.CreateFromConnectionString("...");

上記の例は、私のコードの実際の例です。少なくとも私とこのコードを使用する人々にとっては、次のことは明らかです。 繋がり は DatabaseConnection の子孫ですが、コードを理解したり使用したりするのに正確な型は必要ありません。

「どこでも var を使用する」スタイルを試してみました...そしてこれが私がそれを使い続けなかった理由です。

  1. 時々可読性が低下する
  2. = 以降の Intellisense の制限
  3. 「var」と入力することは、特にインテリセンスを使用する場合、「int」や「string」などと入力するよりもはるかに短いものではありませんでした。

そうは言っても、私は今でも LINQ でそれを使用しています。

型推論が日々を支配する関数型プログラミングの出身である私は、 var 可能な限りすべての地元住民のために。

Visual Studio では、ローカルの型が何であるか疑問に思った場合は、その上にマウスを置くだけで済みます。

これ 役職 var 型インターフェイスまたはオブジェクト型をいつ使用するかについて、いくつかの適切なガイドラインがあります。

私がよく使うのは var どこにでもありますが、同僚は、読みにくいのでやめてくださいと言いました。だから私は今使っています var 匿名型、LINQ クエリ、および右側の where is コンストラクターのみ。

これが Haskell で通常どのように処理されるかに注目するのは興味深いと思います。おかげ カリー・ハワード同型写像, 、Haskell の式の (最も一般的な) 型は推論できるため、いくつかの例外を除いて、型宣言は基本的にどこにも必要ありません。たとえば、型を推測よりも具体的なものに意図的に制限したい場合があります。

もちろん、求められるものと推奨されるものは同じではありません。実際には、トップレベルの定義には常に型宣言があり、ローカライズされた定義には型宣言が省略されるという慣例があるようです。これは、ローカルな「ヘルパー」または「一時的な」定義の読みやすさのための簡潔さと対照的に、定義全体の読みやすさのための明示性との間で良いバランスをとっているように見えます。正しく理解していれば使えない var そもそも「トップレベル」定義(メソッドやグローバル関数など)の場合なので、これは「使用する」という意味だと思います var C# の世界では、どこでもできるようになります。もちろん、「」と入力すると、int" は " と同じキーストローク数です。var」とありますが、ほとんどの例はそれよりも長くなります。

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