ReSharper 2025.3 ヘルプ

契約アノテーション

契約アノテーションでは、与えられた入力に対する期待される出力を定義することができます。言い換えれば、関数の参照型とブール型引数とその戻り値の間の依存関係を定義することができます。契約アノテーションのメカニズムにより、より簡単で安全な方法で消費できる API を作成できます。

[ContractAnnotationAttribute] を使って関数を装飾することによって契約アノテーションを実装することができます。あなたのソースコード、JetBrains.Annotations 名前空間を参照するでそれをやりたいなら。外部アノテーションを使用して既存のバイナリモジュール内の関数にアノテーションを付けることもできます。

使い方

どのようにして契約上のアノテーションを使用することができるのかを簡単に理解するには、以下の例を参照してください。

この例では、Adjust 関数を contract アノテーション属性で修飾しました。この場合の属性引数は、null 引数が常に NULL を返すことを意味します。この例のコードを読んで、このように機能することを簡単に確認できますが、現実のコードでは、この依存関係はそれほど明白ではないかもしれません。ここでの主なものは、関数が入力値をどのように扱うかを記述する契約アノテーション属性です。

Adjust 関数を 'null' 引数で呼び出すと、ReSharper は一度にたくさんの問題を見つけてハイライトします。まず第一に、この式が常に null であることを警告しながら、null 引数を持つ関数呼び出しをハイライトします。それから、この式で初期化された adjusted 変数を追跡し続け、現在は 'null' でもあります。adjusted 変数の不等式が 'null' でないことを確認すると、ReSharper はこの比較は常に false であることを再度警告します。最後に、ReSharper は 'if' ステートメントのコードを到達不能としてグレー表示します。

ReSharper's code inspection based on contract annotation

契約アノテーションの構文

契約アノテーションの入出力関係の依存関係を指定するには、次の構文を使用します。

[ContractAnnotation("[paramName:][input] => output [; [paramName:][input] => output]", [forceFullStates:true])]

input は次のいずれかです。

  • 参照型パラメーターの null/notnull

  • ブールパラメーターの true/false

output

  • 参照型の戻り値の null / notnull / canbenull

  • ブール型の戻り値の true/false

  • halt | stop | void | nothing (交換可能)は、関数が正常に戻らないことを示します。つまり、例外をスローするか、プログラムの実行を停止します。

オプションのブール forceFullStates パラメーター(デフォルトでは false)を使用すると、nullability 分析の悲観的モードを強制できます。つまり、メソッドの戻り値が契約条件によって定義されていない場合、ReSharper はそれが null である可能性があると想定します。

アノテーション:

  • パラメーターが 1 つしかない場合は、paramName を省略することができます。(上の例を見てください)

  • パラメーターがない場合は、paramNameinput の両方を省略できます。

    [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 => outputoutput <= 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 は警告を表示します。

ReSharper: Contract annotations

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

ReSharper: Contract annotations
2025 年 5 月 06 日

関連ページ:

価値と無効性の分析

ReSharper は、可能な「null」逆参照、重複ブール比較および null ・チェックを見つけるのに役立つ値分析を実行します。Null 許容値を分析するさまざまな方法:ReSharper は、いくつかの方法で値を分析できます。言語構成体の動作を理解します。次の例では、パラメーターが明示的に null 可能性をチェックされたという事実に基づいて、ReSharper はの値が実際に 'null' であると合理的に想定し、対応する警告を表示します。null 許容参照型が無効になっている場合、コ...

ソースコードのアノテーション

ReSharper のコードアノテーションの恩恵を受ける最も簡単な方法は、ソースコードのシンボルにアノテーション属性を追加し、ReSharper がソリューションをより正確かつ洞察力で分析できるようにすることです。プロジェクトでコードアノテーションのサポートを有効にする:プロジェクトでアノテーション属性を利用するには、プロジェクトで参照する必要があります。推奨される方法は、アセンブリを使用して NuGet パッケージをインストールすることです。実際には、パッケージを入手するために NuGet W...

外部アノテーション

使い方:ソースが利用できない外部ライブラリを使用している場合、コードアノテーションを指定するための属性をそこで使用することは現実的ではないようです。この場合、外部アノテーションを使用すると、すでにコンパイルされたエンティティを、ReSharper のコード分析エンジンによって認識される属性で補完できます。外部アノテーションを使用すると、ライブラリのコンパイル時に宣言されていなかった属性 (メソッド、パラメーター、その他の宣言) をエンジンに参照させることで、エンジンを「騙す」ことができます。外...

設計時にコードの問題を分析する

ReSharper は、エディターでコードファイルを開くとすぐに分析を開始し、最後まで編集を続けます。検出されたすべてのコードの問題は、重大度に従ってエディターでハイライトされます。問題のマップは、エディターウィンドウの右側のマーカーバーにも表示されます。ここでは、ファイルのステータスを即座に確認し、マークをクリックして特定のコードの問題に移動できます。デザインタイムインスペクションの機能:ReSharper によって実行されるデザインタイムコードインスペクションを説明するために、エディターに...