暗黙的に型指定されたローカル変数の使用[複製]
-
19-08-2019 - |
質問
この質問にはすでに回答があります:
- なぜvarが悪いのか 17の答え
ReSharper の試用版をインストールしましたが、最初にしたことの1つです。明示的に型指定されたローカル変数を暗黙的に型指定されたローカル変数に置き換えることを常に提案していることに注意してください。例:
public string SomeMethod(int aParam)
{
int aNumber = SomeOtherMethod(aParam);
// should be changed to:
var aNumber = SomeOtherMethod(aParam);
}
明示的に型指定された変数は読みやすい(より明示的)と思います。
ReSharperの提案についてどう思いますか?暗黙的に型指定された変数を使用することに利点はありますか?暗黙的/明示的な変数はいつ使用しますか?
解決
個人的には<!>#8220; var <!>#8221のみを使用しています。たとえば、宣言を読むだけで変数Typeを明確に区別できる場合:
var someVariable = new List<int>();
上記の例では、<!>#8220; var <!>#8221; <!>#8220; List <!> lt; int <!> gt; <!>#8221;を指します。
I don <!>#8217; t <!>#8220; var <!>#8221;メソッド定義に移動して、どの変数タイプ<!>#8220; var <!>#8221を見つける必要がある場合ビジュアルスタジオのintelli-popupまたは呼び出されるものに依存する必要があることを表します。たとえば、これは私には大丈夫です:
var someVaraible = SomeMethod();
つまり、<!>#8220; SomeMethod <!>#8221;関数は戻ることになっていますか?コードの行を見るだけでわかりますか? <!>#8217; tができないので、<!>#8220; var <!>#8221;の使用を避ける理由です。そのような状況で。
他のヒント
これについては多くの議論がありますが、ほとんどすべての場所で 'this'キーワードを使用するように、すべて個人的な好みに帰着すると思います。
I 個人的には明示的に型付けされた変数を好みますが、ネストされたジェネリックコレクションを使用する場合、暗黙的に型付けされた変数を使用すると読みやすくなります。見てください:
Dictionary<string, Dictionary<string, string>> myDictionary = new Dictionary<string, Dictionary<string, string>>();
vs:
var myDictionary = new Dictionary<string, Dictionary<string, string>>();
編集:このSOトピックは同じトピックをカバーしていますが、いくつかの素敵な返信があります:使用するもの:varまたはオブジェクト名タイプ
EDIT2:最近では非同期で多くの作業をしていますが、明示的に型指定された変数を使用すると、厄介なバグを防ぐことができる場合があります。ユーザーのIDを返したいというこの愚かな例を考えてみましょう。 GetUserAsync
がTask<User>
を返すことも考慮してください。暗黙的に型指定された変数を使用する場合、次のようなものを使用することになります。
public long GetUserId()
{
var user = GetUserAsync();
return user.Id;
}
これはコンパイルされますが、間違っています。 「ユーザー」は実際にはTask
です。また、Id
にもawait
プロパティがあるため、コンパイルされます。この場合、誤ってユーザーではなくタスクのIDを返します。
public long GetUserId()
{
User user = GetUserAsync();
return user.Id;
}
コンパイラは、タスクをユーザーにキャストできないと文句を言うので、上記はコンパイルされません。もちろん、<=>キーワードを追加することでこれを解決できます。
実際、これは一度起こったことがあります:-)
いくつかの避難者<!>#8217;まだ気付いていない場合、<!>#8220;提案<!>#8221;を簡単に変更できます。 Reshaper(Reshaper-<!> gt; Options-<!> gt; Languages-<!> gt; Context Actions-<!> gt; <!>#8220; Replace type type specification with <!>#8216; var <!>#8217; <!>#8221;)。
個人的にはどこでも明示的な型指定をすることを好みますが、それについてあまりうるさくはありません。
特にジェネリックが含まれる場合は、巨大な型名よりもvar疑似キーワードを入力する方が簡単です。ただし、機能的に同一であることを知っておく必要があります。どちらの方法でもパフォーマンスの違いはありません。コンパイラーは、割り当ての右側の型を導出し、varをその型に置き換えます。 VBバリアントのように、実行時に発生しません。
FWIW、varキーワードは多くの場合、わかりやすく読みやすくなっています。特に...
-
割り当ての右側はコンストラクター式です。
var map = new Dictionary <!> gt;();
-
ローカル変数には適切な名前があります。
HTH