2009-10-02 48 views

回答

2

的 「組合」 其他開關是什麼新:

if (!IsValid(text)) 
{ 
    DoSomeLogging(); 
} 
else switch (text) 
{ 
} 

相同

if (!IsValid(text)) 
{ 
    DoSomeLogging(); 
} 
else 
{ 
    switch (text) 
    { 
    } 
} 

此語法已經由C通過C++繼承。

2
if (IsValid(text)) 
{ 
    switch (text) 
    { 
    case "1": 
     DoSomething(); 
     break; 
    case "2" 
     DoSomethingElse(); 
     break; 
    default: 
     break; 
    } 
} 
6

即使我可以,我也不想合併它們。我認爲分開「驗證」和「處理」是一個好主意。

作爲一個可怕的難看黑客,你可以做這樣的事情:

switch (Validate(text)) 
{ 
    case null: 
     throw ArgumentException("Invalid text"); 
    case "1": 
     DoSomething(); 
     break; 
    case "2" 
     DoSomethingElse(); 
     break; 
    default: 
     break; 
} 

...其中,如果文本是無效Validate返回null。 (當然,這是假設null不是一個有效值。)

但是那太可怕了。我寧願看到:

if (!IsValid(text)) 
{ 
    throw ArgumentException("Invalid text"); 
} 
// No need for an else, just proceed with the switch from here 
0

如何

if (!IsValid(text)) 
    return; 
switch (text) 
{ 
    case "1": 
    DoSomething(); 
    break; 
    ... 
} 

也就是說,只要使用早早出局,沒有必要去嘗試,並結合這兩個結構。

0

如果// Skip真的是它是什麼,然後就反轉條件:

if (IsValid(text)) 
{ 
    switch (text) 
    { 
    case "1": 
     DoSomething(); 
     break; 
    case "2" 
     DoSomethingElse(); 
     break; 
    default: 
     break; 
    } 
} 
0

容易

if (IsValid(Text)) 
    switch(text) 
    { 
     // cases 

    } 

甚至更​​簡潔,如果如果文字是有效的IsValid返回文本和空如果它是不,

private string IsValid(string text) 
{ 
     if (/* code to check if text is valid */) 
     return text; 
     else return null; 
} 

那麼所有你需要的是:

switch(isValid(text)) 
{ 
     //cases: 
} 
0

我剛剛注意到你可以合併一個if/else和switch語句。這是新的3.5嗎?

if (!IsValid(text)) 
    DoSomeLogging(); 
else switch (text) 
{ 
    case "1": 
    DoSomething(); 
    break; 
    case "2" 
    DoSomethingElse(); 
    break; 
    default: 
    break; 
} 
+1

不,'else'只是沒有塊的定義,所以它只適用於下一個語句(就像'else if')。 – bdukes 2009-10-02 14:40:05

+0

Do'h!在這裏,我認爲我發現了一些新鮮有趣的東西。原來,這是我一直避免的事情,因爲我傾向於不留掉大括號,所以如果我需要添加一個,我不會意外跳過一個聲明。 – 2009-10-02 14:58:42

0

一張簡短的版本可能是:

switch (IsValid (text) ? text : null) 
{ 
case null: 
    DoSomeLogging(); 
    break; 
case "1": 
    DoSomething(); 
    break; 
case "2" 
    DoSomethingElse(); 
    break; 
default: 
    break; 
} 

但是,我從來沒有想過,對字符串轉換是一個特別好主意。我不知道編譯器會在這裏生成什麼代碼,所以不能說真正的性能。如果它是偶爾的代碼路徑,它可能是好的。如果它被稱爲很多,那麼這是值得警惕的。

0

switch語句往往是置換多態性(例如,見here)的候選人,這可能會導致更多的「優雅」(簡潔)代碼:

if (!myObject.IsValid()) 
{ 
    DoSomeLogging(); 
} 
else 
{ 
    myObject.ExecuteSomeMethod(); 
} 

如果你擔心你的代碼becomming太詳細地說,也許你應該考慮將它重構爲一個類層次結構?