価値と無効性の分析
ReSharper は、値分析を行い、可能性のある「null」の逆参照や冗長なブール比較および null チェックを見つけるのに役立ちます。
Null 許容値を分析するさまざまな方法
ReSharper は、いくつかの方法で値を分析できます:
言語構成体の動作を理解します。
以下の例では、パラメーター
objが明示的に null 許容性をチェックされたという事実に基づき、ReSharper はobjの値が実際に「null」である可能性があると合理的に想定し、対応する警告を表示します:
null 許容参照型 が無効になっている場合は、 コードアノテーション属性 ([CanBeNull]、 [NotNull]、 [ItemCanBeNull]、 [ItemNotNull]) に依存します。
次の例では、メソッド
Barが[CanBeNull]属性でマークされています。この情報を利用して、ReSharper はBarの戻り値が null である可能性があること、そしてそのメソッドを呼び出すと「null」逆参照につながる可能性があることを警告します:
C# 8.0 以降、プロジェクトで null 許容参照型が有効化されている場合、ReSharper はコンパイラー解析の結果を再利用できます。
等価比較分析
ReSharper は、次の方法で等価演算子 (== および !=) の使用を分析できます:
浮動小数点数の等価比較を報告します。
「意図しない参照比較の可能性」(CS0252 および CS0253) のコンパイラー警告に加えて、比較される型の 1 つだけが
Equals()をオーバーライドする場合も 報告します。Equals()を使用して比較するように設計された型の等価演算子の意図しない使用を 検出するに役立つ [CannotApplyEqualityOperator] 属性を提供します。
値と null 可否の分析モード
ReSharper は、異なるモードで値を分析できます:
- 楽観的
デフォルトでは、値分析モードは楽観的です。 このモードでは、値が明示的に null 許容性をチェックされた場合、またはシンボルが
[CanBeNull]または[ItemCanBeNull]属性でマークされている場合にのみ、ReSharper は可能な「null」逆参照について警告します。 楽観的モードは上記の例で示されています。- 悲観的
このモードでは、値が明示的に null 許容性をチェックされていないすべてのコンテキストで、ReSharper は可能な「null」逆参照について警告します。ただし、シンボルが
[NotNull]または[ItemNotNull]属性でマークされている場合は除きます。
値分析モードを変更したり、分析を無効化したりするには、ReSharper オプション の ページで 値分析モード 環境設定を構成します Alt+R、O 。
null 許容参照型
null 許容参照型 (NRT) が有効化されている場合、ReSharper は C# コンパイラー分析の結果を再利用します。
NRT は、null 値可能性分析の全体的な精度を向上させますが、値が #nullable コンテキストのないコードから取得される場合など、NRT 契約に違反する場合があります。 このような場合、null 値可能性チェック (たとえば、 式は常に「true」または「false」です) で誤検知の警告が表示されることがあります。 null 値可能な API 契約を無視し、コード内の値に対する以前の操作で null 値になるかどうかが保証されている場合にのみ問題を報告するように選択できます。
この動作は、 Alt+Enter メニューから直接変更できます。

... または、ReSharper オプション の ページで null 許容参照型の警告モード オプションを使用します。
ReSharper が null 許容 API コントラクトを無視する場合、null 許容性解析はプログラムの制御フローに依存して冗長な null チェックを報告します。 たとえば、次のようになります。
NRT と ReSharper のサポート方法の詳細については、次のウェビナー録画をご覧ください:
値分析のさらなる例
ここに、ReSharper による値および null 許容性分析のさらなる例を示します:
単純な LINQ クエリで null 許容性のチェックがすでに行われている場合、ReSharper はさらに null 許容性チェックが冗長なことを通知します:

[ItemNotNull]属性を持つコレクションにマークを付けた場合も同じことが起こります。
次の例は、 悲観的モードが有効になっている場合の値分析がどのように機能するかを示しています。 リストの値については null 可能性がチェックされていますが、リスト項目についてはチェックされていません。 したがって、ReSharper はここで「null」逆参照の可能性について警告します。
