2017-10-06 3 views
13

ReSharperのは、私は単にmessageFormatが実際にnullにすることができReSharperにカスタムヌルチェックを教えることはできますか?

_message = string.Format(messageFormat, args); 

を書くとき、それはそれについて私に警告してstring.Formatは、nullではないformat引数が必要であることを知ってくれています。この変数の条件を追加するとすぐに:

if (!string.IsNullOrEmpty(messageFormat)) 
{ 
    _message = string.Format(messageFormat, args); 
} 

警告が消えます。私は、拡張メソッドを使用する場合生憎それはしていません:

if (messageFormat.IsNotNullOrEmpty()) 
{ 
    _message = string.Format(messageFormat, args); // possible 'null' assignment warning 
} 

私の質問は:私の拡張メソッドが!string.IsNullOrEmpty(messageFormat)と同じ意味を持ちティーチのReSharperする方法はありますか?はいある

public static bool IsNotNullOrEmpty([CanBeNull] this string value) => !IsNullOrEmpty(value); 
+0

は、この仕事をしていますか? 静的な文字列EmptyIfNull(この文字列s) { return string.IsNullOrEmpty(s)? "":s; } '' '' _message = string.Format(messageFormat.EmptyIfNull()、args); '' – dumetrulo

答えて

8

拡張は以下のように定義されます。 ReSharperの分析を導くには、ReSharper annotationsを使用する必要があります。すでに[CanBeNull]を使用していますので、プロジェクト内で既に定義されています。

ContractAnnotationAttributeある中で、あなたが興味を持つだろう1:

契約注釈を使用して、与えられた入力に対して期待される出力を定義、または他の言葉で言えば、参照型と関数のboolean型の引数との間の依存関係を定義してみましょう戻り値契約注釈のメカニズムにより、より簡単で安全な方法で消費できるAPIを作成できます。

[ContractAnnotation("null => false")] 
public static bool IsNotNullOrEmpty(this string value) 
    => !string.IsNullOrEmpty(value); 

引数は出力(nullnotnullcanbenulltruefalseに可能な入力(nullnotnulltruefalse)のマップで、:

これは、あなたがそれを使用する方法ですhalt):

[ContractAnnotation("foo: null => halt; bar: notnull => notnull")] 
public string Frob(string foo, string bar) 

あなたはfooパラメータにnullを渡すと飾ら関数は返さない(または例外をスロー)んことを意味し、あなたがbarにnull以外の値を渡した場合、それはnullを返さないことが保証されます。

The documentationは、構文をより詳細に説明しています。ここで


は属性なしで何が起こるかです:

before

警告。消えるは、あなたがそれを追加した後:

after

+0

これは素晴らしいですね!私は 'ContractAnnotation'sを既にここで使用していましたが、このケースでもうまくいくかどうかはわかりませんでした。 'notnull'は必ずしも' true'を意味するわけではないので、この契約が完全に正しいとは思えません。とにかく 'notnull'でも' false'でもある 'string.Empty'でもかまいません。 – t3chb0t

+0

@ t3chb0tあなたは正しいです、契約は間違っています、 'null => false'で十分です –

関連する問題