次の2つのコードスニペットは同じことを達成していますか?これら2つのステートメントは同じですか?
私の元のコード:私は上記のコードは、それを変更する任意の説得力のある理由読みする方がはるかに簡単だと思う
this.SafeFileNames = safeFileNames != null &&
Convert.ToBoolean(safeFileNames.Value);
:
if (safeFileNames != null)
{
this.SafeFileNames = Convert.ToBoolean(safeFileNames.Value);
}
else
{
this.SafeFileNames = false;
}
は良いアイデアは何ReSharperの考えでしたか?
これは速く実行されますか、そして最も重要なのは、コードはまったく同じことでしょうか?
また、:Convert.ToBoolean(safeFileNames.Value);
セクションを見ると、確かにnull参照例外が発生する可能性がありますか?
this.SafeFileNames = bool
ローカルsafeFileNamesは、ここでは、強く型付けされたカスタムオブジェクトであるクラスです:
public class Configuration
{
public string Name
{
get;
set;
}
public string Value
{
get;
set;
}
}
あなたは最初の部分以来 'NullReferenceExcepton'を取得することはありませんステートメント 'safeFileNames!= null'は短絡してしまい、' Convert.ToBoolean(safeFileNames.Value) 'を打つことはありません - thats the wa y &&は動作します。 – Nate
C#の遅延評価のために、null参照例外が発生しませんでした。 &&ステートメントは常に左側と右側が評価されます。しかし、左側が偽であれば、論理的な結果が既に決定されているので、右側を評価することはありません。したがって、safeFileNamesがnullの場合、Convert.ToBoolean呼び出しは行われません。 このようなことは、コードではよくあることです。 –
したがって&&を理解していれば、左の部分がfalseの場合はfalseを返します。そうでない場合は、右の部分を評価し、正しい部分の結果を返します。 –