2010-12-08 4 views
7

警告「可能な 『System.NullReferenceException』」を削除する方法のコードの一部です:ReSharperのは:ここでは

 IUser user = managerUser.GetUserById(UserId); 
     if (user==null) 
      throw new Exception(...); 

     Quote quote = new Quote(user.FullName, user.Email); 

すべてがここに罰金です。しかし、次のいずれかでライン「場合、」私は交換した場合:

 ComponentException<MyUserManagerException>.FailIfTrue(user == null, "Can't find user with Id=" + UserId); 
機能の実装は以下の通りです

:可能な「System.NullReferenceException」第一の使用に向いて:

public abstract class ComponentException<T> : ComponentException 
     where T : ComponentException, new() 
{ 
    public static void FailIfTrue(bool expression, string message) 
    { 
     if (expression) 
     { 
      T t = new T(); 
      t.SetErrorMessage(message); 
      throw t; 
     } 
    } 
    ... 
} 

をその後のReSharperは私に警告を生成し、 'user'オブジェクトの

Q1。なぜそれはそのような例外を生成するのですか?私が見る限り、 'user == null'の場合、例外が生成され、実行は使用ポイントに到達しません。

Q2。その警告を削除するには?注記: 1.私はこの警告をコメントで抑制したくありません(私は似たようなものがたくさんあり、コメント付きのgarbaseでソースコードを変換したくありません)。 2. Resharperの設定を変更して、この問題を警告から「ヒント」の「提案」に変更したくありません。

ありがとうございました。

どのような考えも歓迎です!

P.S.私はresharper 5.1、MVSV 2008、C#

答えて

6

を使用しています。Resharperはパス解析を行わないためです。これは可能な限りnullの参照を見て、それにフラグを立てます。

質問2:あなたが既に提供したもののいずれかを行うことはできません。

0

これは、Resharperエンジンによって発生します。これらの「可能なNullReferenceException」は誰か(おそらくResharper)がメソッドの注釈のどこかで宣言/設定したために起こります。ここで

それがどのように動作するかです:残念ながらReSharper NullReferenceException Analysis and Its Contracts

、時には、これらの便利な注釈は、単に間違っています。

エラーを検出したら、それをJetBrainsに報告し、次のリリースでアノテーションを更新します。彼らはこれに慣れています。

一方、あなたはそれを自分で修正しようとすることができます。記事をもっと読む:)

10

Resharperは分析のための現在の方法だけを見て、あなたが呼ぶ他の方法を再帰的に分析しません。

ただし、Resharperを少し指示して、特定の方法についてのメタ情報を与えることはできます。例えば、 "Assert.IsNotNull(a)"について知っており、分析のためにその情報を考慮に入れます。 Resharperの外部アノテーションファイルを作成し、解析をより良くするために特定のライブラリに関する追加情報を与えることは可能です。おそらく、これはあなたの問題を解決する方法を提供するかもしれません。

詳細はhereです。

Microsoftのライブラリでどのように使用されているかを示す例です。契約はhereです。

3

あなたがnull参照がある場合、このコードは例外がスローされますことを知っている(あるいは期待)します:

ComponentException<MyUserManagerException>.FailIfTrue([...]); 

しかし、これを指定する一切の契約が存在しないので、ReSharperのはこれがちょうどであることを前提としていいずれの場合も例外をスローすることなく返される通常のメソッド呼び出しです。

この方法は、ReSharperの契約を実装する、または(のみデバッグモードに影響を与え、リリースモード用のため、ノーパフォーマンスの低下)、単純な回避策として、ちょうどFailIfTrue呼び出し後に行います。

Debug.Assert(user != null); 

取り除くうまた、FailIfTrueを呼んだ後にあなたが想定した状態が確実に満たされるように、デバッグモードでランタイムチェックを行います。

+0

を持っている... ReSharperの5.1が正しく 'Debug.Assertの(!ユーザー= null)を識別するために失敗した;'と警告を発生させます。私がしなければならない設定はありますか? –

+0

R#5.1はかなり古くなっているので、私はあなたの問題をテストすることは何もしていません。しかし、いくつかのヒント:コードコントラクトがそのために定義されているように、あなたのコードが 'System.Diagnostics.Debug'クラスを適切に参照し、その名前/シグネチャを持つ任意のメソッドではないことを確認してください。また、ビルド構成がDebugに設定されていることを確認してください(そうしないと、コードが有効範囲外になり、警告がポップアップします)。 – Lucero

+0

'Debug.Assert'は動作しますが、デバッグモードでのみ動作します。 –

4

古いポストの新しい答え...

ここResharperのでContractAnnotation経由CodeContractを使用する方法についての私のコードの小さなサンプル:

[ContractAnnotation("value:null=>true")] 
    public static bool IsNullOrEmpty(this string value) 
    { 
     return string.IsNullOrEmpty(value); 
    } 

uの場合、それは...非常に簡単です木のパンくずを見つける。他のケースもチェックできます。

が、私はそれが本当だった望んだの素敵な一日

+1

メソッドが常に例外をスローすることを知っているなら、 '[ContractAnnotation(" => halt ")]' – Dejan

関連する問題