2013-03-01 9 views
5

私が理解して読んでいるように、ifステートメント(& &または||)で短絡を使用すると、2番目の条件が発生しないようにすることができます。両方の条件を有効にするには、単一のオペランド(&または|)を使用します。インラインifステートメント - 短絡

文の場合、私は、インラインを持っているのであれば、次のように言う:MyObjectにはnullの場合、これは私の意見では、私は短絡を使用していてはならないとされ、object referenceエラーがスローされます

var test = (MyObject != null || string.IsNullOrEmpty(MyObject.Property)) ? string.Empty : MyObject.Property; 

。誰かがこれを説明できますか?

+3

あなたは」 '?'の前に閉じ括弧がありません。 – Corak

+0

@Corakはい最後のブラケットを逃した...今編集しました – Zaki

答えて

13

あなたは間違った条件を使用しています。この部分:

MyObject != null || string.IsNullOrEmpty(MyObject.Property) 

は次のようになります。左手はある場合

MyObject == null || string.IsNullOrEmpty(MyObject.Property) 

||のRHSにのみ実行されます。 MyObjectではなく、の場合にのみ実行します。

EDIT:あまりにもかかわらず、

var test = MyObject != null && !string.IsNullOrEmpty(MyObject.Property) 
     ? MyObject.Property : ""; 

注条件演算子の2番目と3番目のオペランドの反転:あなたは本当にMyObject != null一部をしたい場合は、あなたが全体を変えることができます。 !

+0

ああ私がそうすれば、&&の代わりに同じ条件で&&それはうまくなるはずです – Zaki

+0

@ Sam1:他のビットを逆にする必要があります。 –

+0

ありがとうございます。今すぐ明らかになりました:P – Zaki

3

あなたは=

var test = (MyObject == null || string.IsNullOrEmpty(MyObject.Property) ? string.Empty : MyObject.Property 
2

はこの試していない==を持っている必要があります。ここでは

var test = (MyObject == null || string.IsNullOrEmpty(MyObject.Property) 
      ? string.Empty : MyObject.Property 
2
MyObject != null || string.IsNullOrEmpty(MyObject.Property) 

をあなたが言います。

オブジェクトがnullでない場合。 MyObjectにはnullの場合、彼は第二部を実行しようとすることを意味し または string.IsNullOrEmpty(MyObject.Property)

MyObject == null || string.IsNullOrEmpty(MyObject.Property) 

これはMyObjectnullであるため、最初の条件がfalseであるので、第二部は、条件の全体を知るために評価されなければならないので、たまたまヌル例外

2

はスローされません。これに行を変更します。

MyObject != null && string.IsNullOrEmpty(MyObject.Property) 
1

あなたが読みやすさの代わりに、行数、例えばを好む必要があります。

string prop = string.Empty; 
if(MyObject != null && MyObject.Property != null) 
    prop = MyObject.Property; 

(あなたの例外の理由は、すでに他の回答で説明した)

+0

行数が必ずしも目標ではありません。例えば、Lamda /述語の中では、 '{'& '}'の使用を強制して、明示的なリターンも同様に読めないものにすることができます。 – JoeBrockhaus