契約アノテーション
契約アノテーションを使うことで、特定の入力に対して期待される出力を定義したり、言い換えれば、関数の参照型やブール値引数と戻り値の間の依存関係を定義できます。 契約アノテーションの仕組みにより、より簡単かつ安全に利用できる API を作成できます。
[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(交換可能)は、関数が正常に戻らないことを示します。 つまり、例外をスローするか、プログラムの実行を停止します。
オプションのブール forceFullStates パラメーター(デフォルトでは false)を使用すると、nullability 分析の 悲観的モードを強制できます。 つまり、メソッドの戻り値が契約条件で定義されていない場合、ReSharper は null である可能性があると想定します。
備考:
パラメーターが 1 つだけの場合、
paramNameを省略できます(上記の例を参照)パラメーターがない場合は、
paramNameとinputの両方を省略できます:[ContractAnnotation("=> halt")] public void TerminationMethod()または、入力に関係なく関数が同じ出力を持つ場合:
[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 は警告を表示します:

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