54

重複の可能性:
ReSharper がすべてに「var」を使用したいのはなぜですか?

私は ReSharper 4.5 を持っており、これまでのところ非常に価値があると感じていますが、懸念があります。
すべての変数宣言を暗黙的 (var) にしたいようです。
比較的新しい開発者として、これに関して ReSharper をどの程度信頼すべきでしょうか?

以下のコード スニペットは、タブ ヘッダーを描画するメソッドから取得します。

TabPage currentTab = tabCaseNotes.TabPages[e.Index];
Rectangle itemRect = tabCaseNotes.GetTabRect(e.Index);
SolidBrush fillBrush = new SolidBrush(Color.Linen);
SolidBrush textBrush = new SolidBrush(Color.Black);
StringFormat sf = new StringFormat
{
    Alignment = StringAlignment.Center,
    LineAlignment = StringAlignment.Center
};

Resharper は、これら 5 つすべてをvarに変更するよう求めています。次の同様の投稿、Use of var keyword in C#を読みましたが、ReSharper の観点から知りたいです。

4

7 に答える 7

45

Resharper は主にコードのリファクタリングを支援することに関心があり、varキーワードは一般的にリファクタリングを容易にします。たとえば、これらの関数のいずれかの戻り値が互換性のある型に変更された場合、このコードを変更する必要はありません。tabCaseNotesしたがって、たとえば型のリファクタリングが少し簡単になりました。

個人的には、変数が宣言されている行のどこかに変数の型名が明示的にリストされているのを見たいので、最初の 2 行はそのままにしておきたいと思うことがよくあります。どちらかといえば、代わりに使用するインターフェイスを探すかもし​​れません。そうすれば、var重要な読み取り可能な型情報を失うことなく、キーワードと同じ「汎用性」を得ることができます。ただし、私は間違いなくvarfor fillBrushtextBrush、および を使用しsfます。

于 2009-04-10T14:49:24.517 に答える
22

読みやすくするために行にタイプを含める必要はありません。個人的な好みの問題です。私はvarバリエーションが好きです:

var currentTab = tabCaseNotes.TabPages[e.Index];
var itemRect = tabCaseNotes.GetTabRect(e.Index);
var fillBrush = new SolidBrush(Color.Linen);
var textBrush = new SolidBrush(Color.Black);
var sf = new StringFormat
   {
      Alignment = StringAlignment.Center,
      LineAlignment = StringAlignment.Center
   };

更新:物議を醸す見解を追加します。私が本からコードを読んでいない限り、私は通常、私が読んでいるコードのいくつかの行を理解するための特定のタイプが何であるかを気にしません。.GetTableRectangle(e.Index)について考えてみます。これは、それを操作するコードを表示していません。

var itemRect = tabCaseNotes.GetTableRectangle(e.Index);
//do some operations on itemRect

その特定のコードを読んでいる間、私はそのタイプからではなく、itemRectの操作からそれをより理解するようになります。IRectangle、Rectangle、CustomRectangleの場合もありますが、それでもコードがそれを使って何をしているのかについてはあまり説明しません。代わりに、関連するロジックとともに、itemRect.Height、itemRect.Width、またはitemRect.GetArea()をもっと気にします。

更新2:他の人が指摘しているように、オフにすることができます。チームを同じ慣行に保つようにしてください。そうしないと、別の人がコードに触れるたびに、いずれかの方法で変更を加えることになります。参照:http ://www.jetbrains.com/resharper/features/codeTemplate.html

于 2009-04-10T14:59:08.427 に答える
15

Resharperはあなたに使用してほしくvarない、それはあなたにオプションを与えている。使用する場合varは、明示的な型を使用するオプションが提供されるため、勝つことはできません:-)。

編集-トピックを議論する興味深いリンク。

オフにできるようです。[Resharper]->[Options]->[Code Inspection]-> [Inspection Severity]に移動し、少し下にスクロールして、に関連するオプションを確認しますvar

于 2009-04-10T14:57:50.300 に答える
7

Resharper はそれがベスト プラクティスだと考えていますが、リンクされた投稿を読んだように、反対する人もいます。読みやすさを向上させるために明示的な宣言を使用するのが好きですが、それぞれ独自のものです。明示的な宣言を使用する場合は、Resharper でルールを無効にすることができます。

于 2009-04-10T14:47:18.797 に答える
7

C# では、varどこでも使用することを好みます。なんで?firstNameの代わりにstrFirstNameまたは代わりに使用するのと同じ理由amountintAmount。確かに、より詳細な方法は、1 枚の紙または (ご指摘のとおり) 本でより読みやすくなりますが、私のコードはまだ本に掲載されていません。

さて、私はしばらく前に同僚にこのintAmountビジネスについて尋ねたところ、彼は非常に良い点を挙げました. 単純なテキスト エディターでも便利ですが、Intellisense を使用すると、変数にカーソルを合わせるだけで、同じ情報やその他の情報を取得できると彼は言いました。

最後に、私は他の人が指摘した幸せな媒体 (つまりvarnewステートメントでの使用) に感謝し、議論は有効で強力ですが、一貫性と簡潔な読みやすさのみに基づいて、それから遠ざかる傾向があります. intAmount私の一貫性の議論は、読みやすさがあなたにとって非常に重要であるなら、コードの後半でデータ型を伝えることができるように、なぜあなたも使用しないのですか?

于 2012-01-09T23:26:13.863 に答える
0

あなたは確かにそれをオフにすることができます、そして私は持っています。次のように、クラスタイプ名が長い場合には便利だと認めます。

SuperDisconfibulator sd=new SuperDisconfibulator();

varに短縮するのに適した候補ですが、個人的にはそれを変更したいのはそれだけです。メソッドの戻り値から変数が割り当てられている場合(2行目など)に使用するのは良い考えではないと思います。これは、変数がどのタイプを返すのかがすぐにはわからない場合があるためです。

于 2009-04-10T15:03:05.953 に答える
0

この質問は、フレーム戦争を開始するための非常に良い方法です。ただし、あなたとあなたが一緒に働いている人が最も読みやすいと思うことは何でもするべきです。var に関する議論には、双方にとって良い議論があります。

とはいえ、型を明示的に宣言した方が読みやすいと思うなら、それはあなた次第です。Resharper が指示するすべてを実行する必要はありません。必要に応じて、そのルールを無効にすることもできます。

于 2009-04-10T14:48:08.907 に答える