9

これは私を大いに悩ませ、Intellisense (VS 2008 Pro) と組み合わせると、ばかげたバグを書いていることがわかります。

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

    public bool IsAction { get; private set; }
}

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

Intellisense はどういうわけか " isA<tab>" を "IsAction" に変換しました。これは、コンストラクターの入力に関係なく、プロパティFoo.IsAction常にfalse であることを意味します。ただ素晴らしい。

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

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

問題は大文字と小文字を区別する言語ではなく、this. 考えてみると、これも C# というよりも VS 2008 Pro に関する質問です。がなくても既に書かれたコードで生活できますが、thisそれなしで新しいコードを書きたくありません。


ノルドリンの答えは私に考えさせました。

考えてみると、これも C# というよりも VS 2008 に関する質問です。私はすでに書かれたコードで生きることができますが、thisそれなしで新しいコードを書きたくありません。 Intellisense にそれを無効にするように指示できますか?

4

12 に答える 12

6

Visual Studio 2008 でコードを試してみました。組み込みの静的解析をオンにすると、次のエラーが発生します。

警告 3 CA1801: Microsoft.Usage: 'Foo.Foo(bool)' のパラメーター 'isAction' は使用されません。パラメータを削除するか、メソッド本体で使用してください。

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

于 2009-06-05T20:45:31.533 に答える
4

いつでもハンガリー語表記法に戻ることができます [これを入力すると、炎上する準備ができています]。醜さに対処できれば、問題は解決します。これは提案であり、推奨ではありません。

あるいは、静的コード分析がこれをキャッチして警告することを確信しています。FxCopを試してみてください。

編集

私は Resharper を 1 年以上使用していますが、大文字と小文字を区別する方法が非常に賢明であることを知っています。Resharper をインストールすることで、インテリセンスの問題が解決されます。

編集2

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

于 2009-06-05T19:46:03.340 に答える
3

これは一般的な問題です。Microsoft にはパラメーター名に関するいくつかの推奨事項がありますが、あなたのケースではあまり役に立ちません。

他のレスポンダーが言及しているように、C# 言語のスコープ解決動作を「無効にする」ことはできません。最善の方法は、命名規則です。他の人は「ハンガリー語」表記法について言及しています - 一部の人々は、表記法の本来の意図をめぐって混乱しているため、これに対してお決まりの反応を示しています。

私の個人的なアプローチは、文字 'p' をパブリック関数のパラメーター名のプレフィックスとして使用することです。目立たず、シンプルで、簡単に識別でき、Resharperなどのツールを使用して簡単に適用できます。

選択する特定の命名規則は、好みとスタイルの問題です。ただし、選択したプラクティスに一貫性を持たせることには、いくつかの利点があります。

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

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

    public bool IsAction { get; private set; }
}
于 2009-06-05T20:13:35.093 に答える
2

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

個人的には、C# コンパイラは未使用のパラメーターについて警告を表示する必要があると常に感じていました。

于 2009-06-05T20:03:43.477 に答える
1

残念ながら、「暗黙の」機能を無効にする方法はありませんthis。これは言語仕様とコンパイラの一部であり、オフにする方法はありません。

個人的には、これは大きな問題ではないと考えています。確かに、メンバー名とパラメーター名の大文字化には注意が必要ですが、これは C# などの大文字と小文字が区別される言語では常に発生します。

私が推奨する「解決策」(すでに行っているようです)は、thisプロパティ/フィールドを参照するために常にキーワードを使用することです。これにより、パラメーターを使用する必要があるときにすぐに目立つようになります。問題が解決するわけではありませんが、心に留めておけば間違いなく役立つでしょう。これを習慣化するだけで (すべてのパラメーター/ローカル変数名は小文字で始まる必要があることを覚えておくだけでなく)、将来この問題を回避することができます。

于 2009-06-05T19:47:46.253 に答える
1

これはいつも私を取得します。次のように、コンストラクターに渡される変数の先頭に「_」を付けました。

class Foo
{    
    public Foo(bool _isAction)
    {
        this.IsAction = _isAction;
    }
    public bool IsAction { get; private set; }}
于 2009-06-05T19:46:05.617 に答える
0

これは、Visual Studio の IntelliSense の厄介な問題です。ただし、ほとんどの場合、Resharperはそれを正しく処理します。

于 2009-06-05T19:51:04.717 に答える
0

開発者が Intellisense の「isAction」ではなく「IsAction」を選択した可能性が高いと思います。Intellisense が「isA」を「this.IsAction」に変更するとは思わない。

大文字と小文字だけが違う場合、このような間違いを防ぐ唯一の方法は、それらを認識して注意し、単体テストを効果的に使用することだと思います.

于 2009-06-05T19:51:18.290 に答える
0

他の機能では煩わしいかもしれませんが、最近使用したメンバーを Intellisense に事前選択させるオプションをオフにすることができます。これで問題が完全に解決するわけではないことは承知していますが、適切なアイテムが実際に選択されていない場合に、誤ってタブが表示されるのを防ぐのに役立つ可能性があります.

于 2009-06-05T19:54:42.057 に答える
0

ノート:

Resharper を使用している場合は、このコードの多くを記述してエラーを回避するショートカットがいくつかあります。

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

于 2009-06-05T20:11:41.103 に答える