1

そのため、オブジェクトまたは null (オブジェクトが見つからない場合) を取得する Retrieve() 関数があります。そのオブジェクトのブール属性を持つ if ステートメントを使用しています。このように設定されています。

if(Retrieve(index).IsForm == true) {}

これに関する問題は、オブジェクトが見つからない場合、null 参照例外がスローされることです。もちろん、これを回避する方法はいくつかありますが、簡潔だと思う方法はありません。try...catch がありますが、エラーが予想される場合は無意味に思えます。最初にオブジェクトが null かどうかを確認できますがif(Retrieve(index) != null)、それは不要なネストを追加しているように思えます。これを処理する賢い方法はありますか?null 合体演算子を使用することを考えましたが、この状況では機能しません。

4

6 に答える 6

2

メソッドを 2 回呼び出すことができます。

if(Retrieve(index) != null && Retrieve(index).IsForm == true) { }

または、行を分割して、if の前に結果を保存することもできます。

var result = Retrieve(index);
if(result != null && result.IsForm == true) { }
于 2012-08-24T17:00:36.673 に答える
2

IsForm両方の操作を行う関数を作成できます。

bool IsForm(int index)
{
    var result = Retrieve(index);
    return result != null && result.IsForm;
}

if (IsForm(index))
    ...
于 2012-08-24T17:03:53.237 に答える
1

Nullable_IsForm拡張メソッドを作成できます。次に、null条件を確認できます。

public static class RetrieveExtension
{
    public static bool? Nullable_IsForm(this Retrieve retrieved)
    {
        if(retrieved == null)
        {
            return null;
        }
        else
        {
            return retrieved.IsForm;
        }
    }
}

bool次に、コードで値と照合します

if(Retrieve(index).Nullable_IsForm == true) 
{}
else if (Retrieve(index).Nullable_IsForm == false) 
{}
else if (Retrieve(index).Nullable_IsForm == null ) 
{}
于 2012-08-24T17:09:42.337 に答える
1

ここでは Null Object パターンが役に立ちます。呼び出しコードをきれいに保ちますが、追加のクラスを追加します。

class NullWhatever : Whatever
{
    public NullWhatever() { IsForm = false; } 
}


Whatever Retrieve(...) 
{
     ...
     return new NullWhatever();  // instead of null
}
于 2012-08-24T17:02:47.713 に答える
0

これ以上簡潔な方法はないと思います。

私が考えることができる最短は次のとおりです。

if(Retrieve(index)!=null && Retrieve(index).IsForm == true) {}

Retrieve(index)しかし、複数回呼び出すので、これは好きではありません。私は行くだろう

var foo = Retrieve(index);
if(foo!=null && foo.IsForm == true) {}

しかし、それは明らかに賢いことやより簡潔なことをしていません。おそらく、いくつかの代替手段よりも効率的です。

于 2012-08-24T17:02:06.313 に答える
0

両方の条件を同じに入れることができますif:

if(Retrieve(index)!= null && Retrieve(index).IsForm == true) {}

ショートサーキットのおかげで、null チェックが失敗した場合、残りの式は評価されません。

于 2012-08-24T17:04:29.020 に答える