3

私はこれに似たコードを持っています:

string s = CreateString();
if (s == "") foo(s);

s が "" の場合、foo を呼び出す必要があります。string が null の場合 (これは決して起こらないはずです)、NullReferenceException は問題ありません (結局のところ、これは例外的な状況であるため)。

CodeAnalysis は、s.IsNullOrEmpty をテストするように指示します。これにより、意図しない方法で機能が変更されます。

パフォーマンスは問題ではありません。

関連する CA1820 警告を抑制しても安全ですか?

編集:私のケースをよりよく反映するために、コードサンプルとテキストを更新しました。

編集:これは(わずかに変更された)実際のコードです(標準の IXmlSerializable 実装にあります):

public void ReadXml (XmlReader reader)
    // ...
    string img = reader.ReadElementString ("Image");
    if (img != "") {
        Image = Image.FromFile(img);
    }
    // ...
4

8 に答える 8

4

null に関しては動作が異なるため、何をしたいかによって異なります。それはNullReferenceException問題ないと言いますが、引用されたコードにはこれを発生させるものは何もないため、ダウンストリームで予期しないエラーが発生する可能性があります。

私は決して持っていませんが、私はいつも追加したくなる:

static bool IsNullOrEmpty(this string value) {
    return string.IsNullOrEmpty(value);
}

だから私は使用することができます:

if (s.IsNullOrEmpty()) foo();
于 2009-11-02T12:34:00.143 に答える
3

スペック:

s が "" の場合、foo を呼び出す必要があります。string が null の場合 (これは決して起こらないはずです)、NullReferenceException は問題ありません。

CodeAnalysis ルールでアドバイスされているように、文字列の長さをテストするだけです。

if (s.Length == 0) foo(s);

あなたの質問 :

関連する CA1820 警告を抑制しても安全ですか?

あなたはそれを無視することができます、あなたのコードは動作しますが、私はそれをお勧めしません.できるだけガイドラインに従ってください. トピック (パフォーマンス) が問題にならない場合でも、コードの一貫性が向上し、標準的なコードを書くことに慣れます。

于 2009-11-02T13:23:48.977 に答える
2

すべてのコード分析警告には、警告を強調表示してF1を押すとアクセスできる関連ドキュメントがあります。アイテムを右クリックしてヘルプを表示することもできます。

いずれにせよ、その特定の警告を説明するドキュメントは次のとおりです。

そのドキュメントによると、「パフォーマンスが問題にならない場合は、このルールからの警告を抑制しても安全です」。

于 2009-11-02T12:34:20.673 に答える
1

警告を本当に無視しているわけではありません。コードを見て、警告は当てはまらないと判断しました。これは、警告を抑制する完全に妥当な条件です。

純粋な憶測

しかし、あなたが何をしようとしているのかについて、もう少し知りたいと思います。もっと良い対処法があるのではないかと思います。このパターンは、メソッドの成功を知らせるためにエラー メッセージまたは空を返すことを思い出させます。その場合は、void を返して失敗時に例外をスローするか、bool を返してメッセージが重大な場合にのみ例外をスローし、それ以外の場合は true/false を返すことを検討します。

于 2009-11-02T12:43:23.853 に答える
1

テストは次のように記述したほうがよいでしょう。

if(s != null && s == "")

その後、別の if ステートメントで null 値を処理できます

于 2009-11-02T12:33:29.037 に答える
0

null が OK であれば、どちらでも問題ありません。

于 2009-11-02T12:31:33.900 に答える
0

はい。

しかし、string.IsnullOrEmpty を使用した CodeAnalysis は安全な選択です。

于 2009-11-02T12:32:23.500 に答える
0

例外を処理しないのに対し、Can は一般的に悪い考えであるため、null を空として処理するか、例外を処理する必要があるという点で CA は正しいです。戻り値を使用することによって引き起こされる null 参照例外は、非常に悪いことです。少なくとも Debug.Assert(s!=null) を入れて string.Empty と比較してください

于 2009-11-02T12:40:19.337 に答える