2013-03-01 6 views
5

Как я понимаю, вы можете использовать короткое замыкание в инструкции if (& & или ||), чтобы второе условие не срабатывало. и если вы хотите, чтобы оба условия срабатывали, вы использовали бы одиночные операнды (& или |).Inline If statement - short-circuiting

Так сказать, если у меня есть рядный, если заявление, как показано ниже:

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

Это выбросит object reference ошибку, если MyObject имеет нулевое значение, на мой взгляд, не следует, как я использую короткого замыкания. Может кто-то объяснит это.

+3

Вы» не хватает закрывающей круглой скобки перед «?». – Corak

+0

@Corak да пропустил последний кронштейн ...отредактировал сейчас – Zaki

ответ

13

Вы используете неправильное состояние. Эта часть:

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

должно быть:

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

РИТ из || выполняется только тогда, когда левая рука ложной. Вы хотите выполнить его только в том случае, если MyObject is не null.

EDIT: Если вы действительно хотите MyObject != null часть, вы можете изменить все, что нужно:

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

Примечание реверсирования 2-го и 3-го операнды условного оператора, хотя тоже.

+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) 

Вот вы говорите.

Если мой объект не является нулевым. или string.IsNullOrEmpty (MyObject.Property)

Это означает, что если MyObject равен нулю, он попытается выполнить вторую часть.

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

Это не выбросит исключения нулевого

2

Это происходит потому, что MyObject является null и поэтому первое условие false поэтому вторая часть должна быть оценена, чтобы знать все условие. Измените строку следующим образом:

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

Вы должны предпочесть читаемость вместо строки подсчета, например:

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

(причина для исключения уже было объяснено в других ответах)

+0

количество строк не всегда является целью. Например, в рамках предиката Lamda принудительное использование '{' & '}', а также явный возврат может быть таким же нечитаемым. – JoeBrockhaus