2014-09-04 122 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