2012-03-08 78 views
9

如果表達式爲真/假,如何使用三元? :條件執行多個操作?使用三元運算符進行多項操作

wbsource = (exp) ? (Do one thing) : (Do second thing) wbsource = (exp) ? (Do one thing) (Do second thing) : (Do second thing)

對於如:

爲什麼我不能?:

filename = (fp!=null) ? fp; Properties.Settings.Default.filename=fp; Properties.Settings.Default.Save; : Properties.Settings.Default.file; 

之間進行三次操作使用簡單,如果一個條件,我會寫一個簡單的方法如:

if(fp!null) 
{ 
filename = fp; 
Properties.Settings.Default.filename; 
Properties.Settings.Default.Save(); 
} 
else 
{ 
filename = Properties.Settings.Default.file 
} 

什麼是使用上述三元運算符編寫的簡短方法?

+1

我喜歡在這種情況下的if/else方式 - 更容易閱讀恕我直言... – assylias 2012-03-08 11:15:44

+3

一元的意思是「有一個操作數」。 '? :'有*三個*操作數 - 它是一個*三元操作符,它的名字是條件操作符。 – 2012-03-08 11:17:14

回答

14

爲什麼我不能執行三個操作?和:

因爲這些是操作數,這是表達式。每個表達式都會評估一個值;你想要多個陳述。來自Eric Lippert的blog post about foreach vs ForEach

第一個原因是這樣做違反了所有其他序列運算符所基於的函數式編程原則。顯然,調用這種方法的唯一目的是引起副作用。

表達式的目的是計算一個值,而不是引起副作用。聲明的目的是引起副作用。這件事的通話網站看起來極像是一個表達式(不過,無可否認,由於該方法是無效的,返回時,表達只能在一個「語句表達」環境中使用。)

你應該絕對使用if塊來寫這個。它更清晰。

如果你真的,真的要使用此條件運算符,你可以寫:

// Please, please don't use this. 
Func<string> x =() => { 
    Properties.Settings.Default.filename = fp; 
    Properties.Settings.Default.Save(); 
    return fp; 
}; 

string filename = fp == null ? Properties.Settings.Default.file : x(); 
+1

爲什麼不用匿名聲明內聯函數(笑話) – Jodrell 2012-03-08 11:56:52

2

如果你真的想,你可以使用具有side effects功能:

filename = (fp!=null) ? DoOneThing(...) : DoAnotherThing(...); 

儘管維護你的代碼的人不會感謝你。

3

作爲三元運算符(不是一元運算符)的條件運算符不能代替if語句。它是返回兩個結果中的一個的運算符。雖然你可以在一定程度上鍊接:

var result = someBool ? "a" : (otherBool ? "b" : "c"); 

這有點難以閱讀。此外,您正嘗試調用Save()函數,該函數不返回結果,因此您不能將其與此運算符一起使用。

1

簡短的回答,使用if塊,它是唯一的理智的事情。

其他答案,爲骯髒,臭的瘋狂的個人。

filename = (fp!=null) ? Func<string> {fp = Properties.Settings.Default.filename; Properties.Settings.Default.Save; return fp;} : Properties.Settings.Default.file; 
2

如果這是c你會確定感謝"comma operator"

int b; 
int a = (1==1) ? (b=6, somemethod(), 1) : (b=7, 2); 

這裏b將被設置爲6,somemethod將被調用,然後a設置爲1

謝天謝地,這是一個沒有移植過的功能,使用if..else它更清晰。