2009-06-05 8 views
7

これは私に多くのことを気にして私は(プロVS 2008)インテリセンスと組み合わせたとき、私は愚かなバグを書く見つける:C#で暗黙の "this"を無効にするにはどうすればよいですか?

class Foo 
{ 
    public Foo(bool isAction) 
    { 
     this.IsAction = IsAction; 
    } 

    public bool IsAction { get; private set; } 
} 

あなたはそれをキャッチしましたか? IsActionが決して変更されずにバグが発生するまで、私は確かにしなかった。

インテリセンスは何とかプロパティFoo.IsActionは関係なく、コンストラクタ入力の常に偽であることを意味し、私にとって「IsAction」を「isA<tab>」に変換されます。ただ素晴らしい。

私は特に「暗黙的にthis」(正式な名前があるかどうかわかりません)を嫌い、私はそれを仮定しないようにしたいと思います。 これを行う方法はありますか?これは、同じクラスの静的メソッドを呼び出す場合にも適用されます。

また、この小さな問題を回避する命名規則はありますか。プロパティは "IsAction"のままでなければならないので、コンストラクタのパラメータ名の規則にする必要があります。奇妙なことに、正確に一致するスペルで名前を付けると、this.IsAction = IsAction;が正しく機能します。

問題は大文字と小文字は区別されませんが、意味はthisです。今私はそれについて考えて、これはまた、VS 2008のプロの質問のC#よりも。私はthisせずに、すでに書かれたコードと一緒に暮らすことができますが、私はNoldorinの答えは私が考えるようになった


に伝えることを意味することなく、新しいコードを記述する必要はありません。

私はそれについて考えることができました。これはまた、VS2008の質問の多くはC#です。私はすでにthisなしで書かれたコードで暮らすことができます(ただし、私がそこにいたら変更します)。しかし、Intellisenseにそれをやめさせることを意味する新しいコードを書いてはいけません。 Intellisenseにそれを打ち明けるように指示できますか?

+0

これはこの暗示の問題ではありません。あなたがそれをオフにすることができたとしても(私はあなたができないと思う)、私はあなたが数分でそれを再びオンにすると確信しています。 –

+0

私はそうは思わないでしょう。私は私がそれを憎んでいると言いましたか? :) –

+0

私はそれがなくてもあなたのコードを見たいと思っています。プライベートでも保護されているメソッドにも "this"で始まるすべての呼び出しがあります...良いクラスには、目標を達成するための多くの小さなリファクタリングと表現方法があります。あなたはどこにでも "これ"でいっぱいになるでしょう。 –

答えて

3

これは一般的な問題です。マイクロソフトはrecommendations for parameter namesをいくつか持っていますが、あなたのケースではあまり役に立ちません。

他のレスポンダが述べたように、C#言語のスコープ解決動作を「無効にする」ことはできません。最善のアプローチは命名規則です。他の人は「ハンガリー語」の表記法について言及しています。表記のconfusion over the original intentのために、何人かはこれに対するひじょうに反応します。

私の個人的なアプローチは、パブリック関数のパラメータ名の接頭辞として文字 'p'を使用することでした。Resharperのようなツールでは、目立たず、シンプルで、容易に識別でき、実行が容易です。

あなたが選ぶ特定の命名規則は、好みとスタイルの問題です。しかし、あなたが選択したプラクティスで一貫していることからいくらかの利点があります。

私の提案命名規則を使用して、あなたがあなたのコンストラクタを記述します。

class Foo 
{ 
    public Foo(bool pIsAction) 
    { 
     this.IsAction = pIsAction; 
    } 

    public bool IsAction { get; private set; } 
} 
+2

パラメータ名は、インターフェイスの一部で、発信者に表示されます。メンバーフィールドの方がよいというコンベンションがあるかもしれません。 – Richard

4

あなたはいつでもハンガリー表記に戻ることができます。[私はこれを入力すると燃え上がる準備をしています]。醜さに対処できれば、それはあなたの問題を解決するでしょう。これは示唆であり、推薦ではありません。

代わりに、私はかなり静かなコードの分析がこれをキャッチし、あなたに警告することを確信しています。 FxCopを試してみてください。

EDIT

私は今、一年以上ReSharperのを使用している、と私はそれは大文字と小文字が区別方法であなたを支援について非常にスマートであることを知っています。他の利点の中でも、あなたのIntelliSenseの問題は、Resharperをインストールすることで解決されます。私はちょうどチェックし

EDIT 2

。 FxCopもResharperもこのエラーを直接キャッチしません。両方とも捕捉するのは、isActionパラメータがFooメソッドで使用されていないという事実です。この場合、警告はあなたを間違いの手がかりにします。メソッド内でパラメータが別の方法で使用されている場合は、静的コード分析が行われる可能性があります。

+0

私はハンガリー記法について言及しているイベントを知っていましたが(私はそれをお勧めしませんでしたが)、下降音を引き出すでしょう。 :) –

+0

はい、しかし静的なコード分析の提案は私から+1を得ました...それはこれを捕まえたでしょう:-) –

+0

、ハンガリーの表記はありません!あなたがそれをお勧めしていない場合はなぜそれを言及したのか分かりません。 – Noldorin

1

これは私にすべての時間を与えます。私が「暗黙のthis」機能を無効にする方法はありません怖い

class Foo 
{  
    public Foo(bool _isAction) 
    { 
     this.IsAction = _isAction; 
    } 
    public bool IsAction { get; private set; }} 
+3

通常、アンダースコアはパラメータではなくインスタンス変数を示すために予約されています。このパラメータを使用してパラメータを指定すると、うまくいくはずですが、コンベンションに精通していない開発者にとっては不便かもしれません。 –

+0

私はオートプロパティをしない場合、私は私のプロパティ "IsAction"と私のバッキングフィールド "_IsAction"という名前のコンベンションはそれらのため動作しません。 :) –

+5

私はあまりにも前にそれを見ましたが、それはひどく醜いです。プライベートフィールドの名前を付けることは許容されています(Microsoftによっても使用されることもありますが)。 – Noldorin

1

:ように私は、「_」でコンストラクタに渡される変数を付加する撮影しました。これは言語仕様とコンパイラの一部であり、これをオフにする方法はありません。

個人的には、これは大きな問題ではありません。確かに、メンバ名やパラメータ名の大文字小文字を区別することは重要ですが、これはC#などの大文字と小文字を区別する言語の状況です。

私がお勧めする「解決策」は既にプロパティ/フィールドの参照に常にthisというキーワードを使用しているため、パラメータを使用するときにすぐに目立つようにする必要があります。それはあなたのために問題を解決するつもりはありませんが、もしあなたがそれを念頭に置くなら、間違いなく助けになるでしょう。ちょうどこれの習慣に入るだけでなく、のすべてのパラメータ/ローカル変数名は、小文字ので始まることを覚えておいてください。

+0

私はコメントするつもりだったが、ここではもう一度質問を修正するつもりだ。 –

+0

だから、私が理解している限り、すべての*プロパティ*に対してIntellisenseの提案を無効にしたいのですか?私はこれが不可能だとはかなり確信していますが、私はそれについて考えるでしょう。 – Noldorin

+0

私はそれが暗黙のクラスメンバ、すなわちインスタンスを引き込まないようにしたいが、静的もうまくいく。 –

0

これはVisual Studioのインテリセンスで厄介な問題です。 Resharperはほとんどの時間それを右得ます。

0

私は、開発者がIntellisenseの "isAction"の代わりに "IsAction"を選んだ可能性が高いと思います。私はIntellisenseが "isA"を "this.IsAction"に変更するとは思わない。

名前が大文字と小文字だけ異なる場合は、このような間違いを防ぐ唯一の方法は、注意していることと単体テストを効果的に使うことです。

+0

はい、この場合、デフォルトのVSインテリセンスでは、より具体的な大文字と小文字の一致(つまり、isAction引数)がデフォルトになるためです。これはユーザエラーでした;-) –

+0

もしあなたがそれに落ちるならば、開発者のエラーから派生したバグです。開発者のエラーが原因で、バグが重複し、私の質問に少しでも役立たないと言いました。私はバグを避けるためにこれらのエラーを減らす方法を探しています。 –

+0

これはC#;で動作する予定です)。また、プロパティは常に大文字で始める必要があります(たとえコード解析でもわかります)。コード内の関数にも同じことが言えます。常に大文字で始める必要があります。 – Nordes

0

他の容量では迷惑かもしれませんが、Intellisenseに直前に使用したメンバーをあらかじめ選択させるオプションをオフにすることができます。実際に問題を完全に解決することはできませんが、本当に適切な項目が選択されていないと、誤ったタブを防ぐのに役立つ可能性があります。

2

isActionパラメータが決して使用されないので、FxCopはこれについて文句を言います。具体的には、ルールCA1801:ReviewUnusedParametersを取得します。

個人的には、私はいつもC#コンパイラが未使用のパラメータについての警告を出さなければならないと感じました。

0

注:

あなたはReSharperのを使用している場合、あなたはあなたのために、このコードの多くを書いて、エラーを回避するいくつかのショートカットがあります。

最初にプロパティを作成し、Alt-Insを押して「コンストラクタを生成」を選択するか、コンストラクタにパラメータ「isAction」を追加し、parameterNameのキャレットでAlt-Enterを押し、ポップアップメニューから「自動プロパティIsActionの作成と初期化」アクションを実行します。

+0

私のもう一つのお気に入りは、長い名前のメンバーがいる場合です。 Intellisenseを使用して、IAATIVLと入力してIsAnotherActionThatIsVeryLong、iAATIVLを入力してisAnotherActionThatIsVeryLongを検索します。私がそれを持っていない限り、私はそれを見逃していたことを知らなかった。 –

6

私はちょうど2008年には内蔵の静的解析をオンにするのVisual Studioでコードを試してみた次のエラーが得られます。

Warning 3 CA1801 : Microsoft.Usage : Parameter 'isAction' of 'Foo.Foo(bool)' is never used. Remove the parameter or use it in the method body.

私が提案しているのは、このようなエラーを早期に見つけ出すことです。これを有効にするには、プロジェクトのコンテキストメニューからプロパティを選択し、[コード分析]タブを選択し、[ビルド時にコード分析を有効にする]を選択します。

関連する問題