13

私が書いている条件は、3つのことをチェックしています。

if(LoggedInMembershipUser == null || obj == null || boolVal)

この場合、「LoggedInMembershipUser」は単なるMembership.GetUser()であり、「obj」はランダムなビジネスオブジェクトであり、「boolVal」は明らかにブール値です。上記のようにステートメントを書くと、ReSharperはステートメントのboolVal部分が常にfalseであると教えてくれます。しかし、以下のように最初にboolValを入れても、その通知はありません。

if(boolVal|| LoggedInMembershipUser == null || obj == null)

なぜ最初のものは常に偽であるのに、2番目のものはそうではないのでしょうか?

編集:これはグリッドビューの行データバインドにあります。グリッドは、同じ基本クラスを持つ2つのオブジェクトからの結果を表示しているため、「obj」は、オブジェクトタイプの一方であるが他方ではない場合、値を持ちます。boolValは、それがどのタイプのオブジェクトであるかを示すインジケーターであるため、考えてみると、objがnullの場合、boolValは常にtrueになります。ReSharperはどういうわけかそれを認識していましたか?ああ、それは私が持っている行の上に私のコードを見たからだと思います:

if (!uploaded){
    var obj = GetObjectLogic();
}

ヘルプコメントをありがとう。私はこれが削除されるか何かに投票することができると思います。

4

2 に答える 2

16

これ以上の方法がなければ、確実に知ることは困難ですが、確かに次のように見えます。

ReSharper は、 true になることができる唯一の方法は、またはboolValの少なくとも 1 つが null である場合であると判断しました。両方が null でない限り、その最初の部分に到達することはありません。したがって、 が評価される時点では false でなければなりません。LoggedInMembershipUserobjifboolvalboolVal

条件を並べ替えると、そのロジックは成り立たなくなります。ReSharper は潜在的にその式を分析し、すべての部分が高速で副作用がないことboolValを判断し、2 番目のケースでも必要ないことに気付く可能性がありますが、その分析はやや難しく、明らかに書かれていません。

于 2013-01-24T21:01:02.407 に答える
3

Expression is always true|falseReSharper を使用して予期しないシナリオを調査するたびに、このツールは私よりも優れていることが証明されました。たとえば、ReSharper は継承ツリーを認識しています。このコード ブロックで:

void doSomething(Object obj)
{
    if(obj is StreamReader || obj is TextReader)
        foo();
}

...ReSharper は としてマーク(obj is TextReader)しますExpression is always false。これは、(obj is StreamReader)コード ブランチが既にTextReaderオブジェクトをキャプチャして にジャンプしfoo()、それ以上の評価を省略しているためです。

于 2014-10-29T15:57:19.587 に答える