契約アノテーション
契約アノテーションを使うことで、特定の入力に対して期待される出力を定義したり、言い換えれば、関数の参照型やブール値引数と戻り値の間の依存関係を定義できます。 The mechanism of contract annotations allows creating APIs that could be consumed in an easier and safer way.
[ContractAnnotationAttribute] を使って関数を装飾することによって契約アノテーションを実装することができます。 あなたのソースコード、 JetBrains.Annotations 名前空間を参照するでそれをやりたいなら。 外部アノテーション を使用して既存のバイナリモジュール内の関数にアノテーションを付けることもできます。
仕組み
どのようにして契約上のアノテーションを使用することができるのかを簡単に理解するには、以下の例を参照してください。
この例では、 Adjust 関数を contract アノテーション属性で修飾しました。 この場合の属性引数は、null 引数が常に NULL を返すことを意味します。 この例のコードを読んで、このように機能することを簡単に確認できますが、現実のコードでは、この依存関係はそれほど明白ではないかもしれません。 ここでの主なものは、関数が入力値をどのように扱うかを記述する契約アノテーション属性です。
Adjust 関数を 'null' 引数で呼び出すと、ReSharper は一度に多くの問題を 発見してハイライトします。 まず第一に、この式が常に null であることを警告しながら、null 引数を持つ関数呼び出しをハイライトします。 それから、この式で初期化された adjusted 変数を追跡し続け、現在は 'null' でもあります。 adjusted 変数の 'null' でないことを確認すると、ReSharper はこの比較が常に false であることを再度警告します。 最後に、ReSharper は 'if' ステートメント内のコードを到達不能としてグレー表示します:

契約アノテーションの構文
契約アノテーションの入出力関係の依存関係を指定するには、次の構文を使用します。
input は次のいずれかです。
参照型パラメーターの
null/notnullブールパラメーターの
true/false
output は次のいずれかになります。
参照型の戻り値の
null/notnull/canbenullブール型の戻り値の
true/falsehalt|stop|void|nothing(交換可能)は、関数が正常に戻らないことを示します。 つまり、例外をスローするか、プログラムの実行を停止します。
The optional boolean forceFullStates parameter, which is false by default, allows you to force the pessimistic mode for the nullability analysis. That is, if the method return value is not defined by the contract condition, ReSharper assumes that it might be null.
備考:
パラメーターが 1 つだけの場合、
paramNameを省略できます(上記の例を参照)パラメーターがない場合は、
paramNameとinputの両方を省略できます:[ContractAnnotation("=> halt")] public void TerminationMethod()or if the function has the same output independently of the input:
[ContractAnnotation("=> halt")] public void TerminationMethod(object data, bool flag)同じパラメーターに対して複数の条件を追加できます。
[ContractAnnotation("input:null => null; input:notnull=>notnull")] public object Transform(object input, bool flag)条件を逆にすることもできます。つまり、
input => outputはoutput <= inputと等しいです:[ContractAnnotation("null <= surname:null")] public string GetName(string surname)'out' パラメーターの期待値を指定することもできます。 同じ入力条件に対して戻り値と出力パラメーターの両方を指定する場合は、コンマを使用します。
[ContractAnnotation("s:null => false,result:null")] public bool TryParse(string s, out object result)
契約条件の検証
ソースコードで契約アノテーションを関数に付与すると、ReSharper は関数シグネチャーに従って契約条件を検証します。 契約アノテーションが関数パラメーターに合わない場合、ReSharper は警告を表示します:

契約アノテーションが戻り値に合わない場合も同じことが起こります。
