2014-09-04 123 views
0

我在想,如果有可能重構通過三元運算符下面的代碼:用三元運算符可以做到這一點嗎?

if (HasKey("pagesPause")) 
{ 
    Pause(GetInt("pagesPause")); 
} 
else 
{ 
    Pause(); 
} 

例如:

Pause(HasKey("pagesPause") ? GetInt("pagesPause") : void); 

它不void想法(我使用C#)工作。

有沒有辦法做到這一點?

+2

重構應該將代碼更改爲更好的可維護性。第二段代碼(如果它是正確的)與第一段相比是可怕的。 – zerkms 2014-09-04 10:43:44

+0

不,這是不可能的。你能傳遞任何默認值,例如'0','-1','null'嗎?如果你使'Pause'方法的'pagesPause'參數爲空('int?'),後者是可能的。如果你這樣做,你可以定義一個新的方法'GetIntOrNull'封裝'HasKey? GetInt:null',你的代碼會讀作'Pause(GetIntOrNull(「pagesPause」))'。 – chiccodoro 2014-09-04 10:49:03

回答

2

我想指出的是,Pause(Int)Pause(void)難道不具有相同的簽名(自然),所以這是不可能這樣做,你試過的方式(一個調用不同的簽名的兩個功能)。
如果考慮到其他答案中提到的三元運算符的限制,問題會變得更糟。

+0

true - 因爲方法的兩個重載實際上是兩個不同的方法,它們看起來具有相同的名稱。哪一個被調用是在編譯時通過匹配調用的簽名和方法的一個來確定的。 – chiccodoro 2014-09-04 11:07:45

0

我認爲這就是你要找的。

var pauseValue = HasKey("pagesPause") ? Pause(GetInt("pagesPause")) : Pause() ; 
+0

這不起作用,三元運算符應該用作表達式。 – 2014-09-04 10:43:42

+0

等待,只要「暫停」返回一些內容,此*將*工作。 – Rawling 2014-09-04 10:45:05

+1

不幸的是,在任何情況下都不起作用。 C#禁止像'true;'這樣的語句。 – Dirk 2014-09-04 10:45:59

2

你可能是有點浪費和使用條件來選擇一個操作調用

(HasKey("pagesPause") ?() => Pause(GetInt("pagesPause")) : (Action)(Pause))(); 

符合該要求,雖然可能不是簡化了代碼的意圖。

或者,如果無參數的版本就相當於給定的默認參數調用,你能找到的值並傳遞到Pause(int)

Pause (HasKey("pagesPause") ? GetInt("pagesPause") : INFINITY); 

但如果有一個合適的默認,我會更可能改變GetInt,因此它會檢查密鑰並在沒有密鑰時使用默認值。

Pause (GetIntOrDefault("pagesPause", INFINITY)); 
+0

+1您基本上「複製」了我的評論:-)(除了花哨的lambdas建議) – chiccodoro 2014-09-04 11:09:47