CodeAnarise の警告を無視しても問題ありません:string == “” を string.IsNullOrEmpty に置き換えますか?

StackOverflow https://stackoverflow.com/questions/1661024

  •  12-09-2019
  •  | 
  •  

質問

これに似たコードがあります:

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

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

コード分​​析は、s.IsNullOrEmpty をテストするように指示します。これにより、機能が意図しない形で変更されてしまいます。

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

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

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

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

public void ReadXml (XmlReader reader)
    // ...
    string img = reader.ReadElementString ("Image");
    if (img != "") {
        Image = Image.FromFile(img);
    }
    // ...
役に立ちましたか?

解決

これは、ヌルに関して異なる動作をしますので、それはあなたが起こるしたいのかによって決まります。あなたはそのNullReferenceExceptionはOKだろう言及し、それが下流の予期しないエラーが発生する可能性があり、したがってその理由は、これを引き上げる引用コードでは何も、ありません。

私は<なかっem>のHAVE を決して、私はいつも追加したくなるよ。

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

私が使用できるようにします:

if (s.IsNullOrEmpty()) foo();

他のヒント

仕様:

s が "" に等しい場合は、foo を呼び出す必要があります。文字列がnullである場合、それは決して起こらないはずです、nullreferenceexceptionは問題ありません。

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

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

あなたの質問 :

関連するCA1820警告を抑制するのは安全ですか?

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

すべてのコード分析の警告は、警告をhighligtingとの F1 を押すことによってアクセスできる文書を関連付けられています。また、ヘルプを表示する項目を右クリックすることができます。

いずれにせよ、ここでは特定の警告ドキュメントです>。

その文書によると、「パフォーマンスが問題でない場合は、この規則から警告を抑制しても安全」である。

としてテストを記述する方が良いだろう

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

あなたはその後、別のif文でnull値を処理することができます。

あなたは本当に警告を無視していない、あなたはコードを見て、警告が適用されないことを決めました。これは、警告を抑制するための下で完全に合理的な条件である。

ピュア投機

私はしかし、あなたがやろうとしたものについてもう少し知っていたいです。私はそれを処理するためのより良い方法があるかもしれないことを疑います。パターンは、メソッドの成功を知らせるために、エラーメッセージや空を返すのを思い出します。その場合は、私はどちらかがvoidを返すと、失敗した場合に例外をスローするか、ブール値を返すだけのメッセージが重要な場合に例外を投げると戻って検討する真/それ以外の場合はfalseます。

nullがOKである場合は、

、あなたがいずれかの方法大丈夫ます。

はいます。

しかし、私はstring.IsnullOrEmptyでCodeAnalysisに同意するだろう安全な選択です。

CAは、あなたのどちらかが空としてnullを治療または例外を処理する必要があるという点で、権利であるのでgennerally悪い考えであるあなたができるのに対し、

例外を処理していません。戻り値を使用することによって生じたnull参照の例外が非常に悪いことです。非常に少なくとも、Debug.Assertの(S!= null)の中に入れて、

String.Emptyをと比較します
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top