65

ReSharperの試用版をインストールしたところ、最初に気づいたことの 1 つは、明示的に型指定されたローカル変数を暗黙的に型指定された変数に置き換えることを常に提案していることです。

public string SomeMethod(int aParam)
{
    int aNumber = SomeOtherMethod(aParam);
    // should be changed to:
    var aNumber = SomeOtherMethod(aParam);
}

明示的に型付けされた変数の方が読みやすい (より明示的) と思います。

ReSharper の提案についてどう思いますか? 暗黙的に型指定された変数を使用する利点はありますか? いつ暗黙的/明示的な変数を使用しますか?

4

5 に答える 5

74

個人的には、宣言を読むだけで変数 Type を明確に区別できる場合にのみ「var」を使用します。たとえば、次のようになります。

var someVariable = new List<int>();

上記の例では、「var」が「List<int>」を参照していることは明らかです。

「var」が表す変数の型を調べるために何らかのメソッド定義に移動する必要がある場合、またはビジュアル スタジオの intelli-popup または呼び出されるものに依存する必要がある場合、「var」を使用するのは好きではありません。私にはよくありません:

var someVaraible = SomeMethod();

つまり、「SomeMethod」関数は何を返すことになっているのでしょうか? コード行を見ただけでわかりますか? できないので、そのような状況では「var」を使用しないようにしています。

于 2009-03-16T15:48:22.977 に答える
39

これについては多くの議論がありますが、ほとんどどこでも「this」キーワードを使用するのと同じように、すべて個人的な好みに帰着すると思います.

個人的には明示的に型指定された変数を好みますが、ネストされたジェネリック コレクションを使用する場合は、暗黙的に型指定された変数を使用すると読みやすくなります。見る:

Dictionary<string, Dictionary<string, string>> myDictionary = new Dictionary<string, Dictionary<string, string>>();

対:

var myDictionary = new Dictionary<string, Dictionary<string, string>>();

編集: この SO トピックは、同じトピックをカバーしています。

EDIT2: 最近は非同期で多くの作業を行っていますが、明示的に型指定された変数を使用すると、厄介なバグを防ぐことができる場合があります。ユーザーの Id を返したいこのばかげた例を考えてみましょう。GetUserAsyncを返すことも考慮してTask<User>ください。暗黙的に型指定された変数を使用すると、次のようなものを使用することになります。

public long GetUserId()
{
  var user = GetUserAsync();
  return user.Id;
}

これはコンパイルされますが、間違っています。「ユーザー」は実際にはTask<User>. Taskまた、プロパティも持っているため、コンパイルされIdます。この場合、誤ってユーザーの代わりにタスクの ID を返すことがあります。

public long GetUserId()
{
  User user = GetUserAsync();
  return user.Id;
}

コンパイラは、ユーザーにタスクをキャストできないと不平を言うため、上記はコンパイルされません。awaitもちろん、キーワードを追加するとこれが解決します。

私は実際にこれが私に一度起こったことがあります:-)

于 2009-03-16T15:40:29.250 に答える
17

まだ気づいていない人がいる場合に備えて、Reshaperで「提案」を簡単に変更できます(Reshaper->オプション->言語->コンテキストアクション->「明示的な型の指定を「var」に置き換える」)。

私は個人的にどこでも明示的な型指定をすることを好みますが、私はそれについてあまりうるさくはありません。

于 2009-03-16T17:06:21.773 に答える
6

特にジェネリックが関与する可能性がある場合は、巨大な型名よりも var 疑似キーワードを入力する方が簡単な場合があります。ただし、機能的には同じであることを知っておく必要があります。パフォーマンスの違いなどはありません。コンパイラは代入の右側の型を導出し、var をその型に置き換えます。VB バリアントのように実行時に発生することはありません。

于 2009-03-16T15:35:37.000 に答える
6

FWIW、多くの場合、var キーワードは簡単に読めます。特に...

  1. 代入の右側はコンストラクタ式です。

    var map = 新しい Dictionary>();

  2. ローカル変数には適切な名前があります。

HTH

于 2009-03-16T15:40:47.283 に答える