9

人間が読めないコードを除いて、関数のすべての変数にvarを使用しない別の理由はありますか?つまり、int、SqlCommand、stringを使用せず、代わりにvarを使用すると、パフォーマンスが低下しますか?

4

5 に答える 5

18

「var」を使用しても使用しなくても、パフォーマンスなど、プログラムのその他の観察可能な特性は変わりません。

「var」を使用するかどうかの問題は、コンパイルされたアーティファクトへの影響ではなく、人間の読者とコードの管理者への影響にかかっています。

この素晴らしい記事をご覧ください: https://docs.microsoft.com/en-gb/archive/blogs/ericlippert/uses-and-misuses-of-implicit-typing

于 2011-05-10T14:56:59.813 に答える
7

はい、varどこでも使用できます。

私はvarが大好きです。キーストロークの負荷が軽減されました。これは、「最初に使用する」方法でコーディングするのに役立ち、リファクタリングをより強力にします。

タイプの名前は関係ありません。インテリセンスは、その型で何ができるかを教えてくれます。重要なのはそれだけです。

型名を知っていたとしても、インテリセンスが壊れていればあまり役に立ちません。型名だけでは、特定のメソッドやプロパティが何と呼ばれているかを必ずしも知ることができないからです。

var物事をより良くするいくつかの詳細:

  • メソッドの呼び出し (それが何を返すかを知らずに - 特にジェネリック型の場合)

こいつは大きい。メソッドが何を返すか覚えていないことがよくありますが、そのメソッドの名前は知っています。戻り値の型を頭から引き出さなければならないので、速度が低下します。を記述し、入力を使用してメソッドを呼び出すだけvarで、voila intellisense が戻り値の型とそれを使用して何ができるかを教えてくれます。

// Imagine a method that creates a return type that gets some generic type from the call arguments
Tuple<TA,TB,TC,TD,TE> Combine<TA,TB,TC,TD,TE>(TA a, TB b, TC c, TD d, TE e);

// GOOD: Call this with var
var combo = Combine( "Some text", 42, true, new Dictionary<int, List<string>>(), "Other text");

// BAD: Without var
Tuple<string, int, bool, Dictionary<int, List<string>>, string> combo = Combine( "Some text", 42, true, new Dictionary<int, List<string>>(), "Other text");
  • 戻り型のリファクタリング

を使用するvarと、コンパイラはその型がどこで誤用されているかをすぐに教えてくれます (おそらく、新しい戻り値の型には同じプロパティ名がありません)。

を使用しないvarと、型の割り当てに失敗したというエラーが表示されます。次に、その型を新しい型 (呼び出されたすべての場所) に変更する必要があり、最終的にその型が正しく使用されていないという警告が表示されます。

  • 型名を再入力するのではなく、変数の名前付けに集中してください。

varこれまでに C# に起こった最高の出来事の 1 つです。

// BAD: No var
Dictionary<int,List<Tuple<int,bool,string>>> ahhhhThatWasDifficult = new Dictionary<int,List<Tuple<int,bool,string>>>();

// GOOD: With var
// I can think of a good name before writing this complex type
var validNameCountDictionary = new Dictionary<int,List<Tuple<int,bool,string>>>();

私がまだあなたを納得させていないなら、あなたが使いたいのであればとにかくあなたには選択の余地がありません:

  • 匿名型
  • リンク

だから、ずっと行ってvarどこでも使ってみませんか。

あいまいであることはわかっていますが、コードを常に使用varして一貫した外観にするために、時々これを行うこともあります。

var number = (int?) null;

私はvarが大好きです。

letPS Typescript/ES6 で置き換えているのは少し悲しいですがvar、Javasctipt var!== C#var

于 2016-04-16T23:09:27.743 に答える
7

それは間違いなくパフォーマンスヒットではありません。var は実際には型ではなく、コード内のプレースホルダーです。つまり、「この変数の型を書きたくない」ということです。実際、Visual Studio でテキストにカーソルを合わせると、長すぎて記述できないと判断した型を示すツール ヒントが表示されます。

ただし、真面目な話、コードから型が明らかな場合は、一般的に var を使用して、他の人がそれを読んだときに混乱しないようにする必要があります。

于 2011-05-10T14:57:52.817 に答える
-18

についてimplicit and explicit typingです。C#.NET は型付き言語です。つまり、メモリに格納するデータの型を定義します。それを定義しないと、一部の操作の安全性が低下するため、可能な限り明示的に入力する必要があります。ただし、場合によっては、型がコードから明らかであるため、コンパイラに任せて、変数がどの型であるべきかを判断することができますimplicit typing

型を持たないことの問題は、基本的に 1 と 0 の集まりであるメモリ内で、このデータが何かを意味する可能性があることです。そのため、最初に位置 000001 に整数を配置し、後でそれを Cat として読み取ろうとすると (想像してみてください)型である場合)、メモリから読み取った内容はあまり意味がありません。それが、型システムが発明された理由です。どのデータをどこに保存しているかを伝え、人間が再び理解できる方法でデータを読み戻すことを確認します。結局のところ、データが何であるかは重要です。

于 2011-05-10T15:04:45.150 に答える