2011-06-18 64 views
3

嗨,我是在看一些舊的C#代碼,並注意到這樣一個大量的代碼拋出else塊甚至是必要的?我可以安全地縮短代碼而不會產生影響嗎?程序流程C#

void SomeFunction() 
{ 
    if (key.Length != Dimensions) 
    { 
     throw new KeySizeException(); 
    } 

    SomeOtherFunction(); 
} 

默認情況下,異常應該拋出程序流出這種方法吧?但是我只是想知道DotNet是否有辦法調整未處理的異常如何處理,這會導致第二個實現與第一個實現的工作方式不同?

+0

在技術上它們是相同的。你可以根據可讀性來決定。有些人發現其他的艾滋病閱讀。 –

+0

乾杯,我個人覺得沒有它更可讀。由於這個舊代碼遍地亂放,我開始懷疑是否可能有重寫它的副作用。 – CodeAndCats

回答

5

你不需要'else'塊。這是多餘的。如果使用「Reshaper」或「JustCode」這樣的重構工具,通常會指出這樣的冗餘代碼元素。

+0

太棒了,我不認爲會有改變它的副作用,但是看到它在我繼承的代碼中反覆完成,讓我感到驚訝。知道重構工具指出這只是我想要的保證,謝謝。 – CodeAndCats

1

這兩者完全等價。

3

throw是該代碼塊中的顯式終端,該方法調用將在該點有效結束。這意味着else塊是多餘的,可以刪除。

0

正如其他人所說的那樣,這兩段代碼是等同的。

雖然我想我會有一些額外的想法。

首先,所示的代碼實質上實現了一個包裝器方法(SomeFunction),該方法作爲SomeOtherFunction的保護子句。我會小心這樣做的 - 當你的KeySizeException被捕獲時,你不會僅僅從StackOtherFunction所涉及的堆棧跟蹤中知道。這也意味着通過對該方法進行簡單的代碼檢查,您無法看到SomeOtherFunction的這一要求。

此外,您可能會考慮將這些類型的代碼轉換爲.Net 4.0代碼合同 - 它們可以更輕鬆地閱讀代碼。

最後的想法 - 在像你這樣的情況下,我有時試圖離開別人。這使得其他人100%清楚if/else行爲是有意的。

+0

當然,我猜你的真實代碼看起來與你的例子有很大不同 - 如果是這樣,請忽略:) –

+0

嗨,大衛感謝您的建議。儘管你在評論中是正確的,但我只是在這個例子中弄虛作假,真正的代碼是不同的。 – CodeAndCats

1

在C#中都以相同的方式工作。我認爲你在想如果你處理異常(而不是拋出它),如何擺脫執行第二個陳述?

void SomeFunction() 
{  
    if (key.Length != Dimensions)  
    { 
     throw new KeySizeException(); //Halt the execution of SomeFunction method 
    } 
     SomeOtherFunction(); 
} 

如果您處理並不想執行SomeOtherFunction,您可以返回如下。

void SomeFunction() 
{  
    if (key.Length != Dimensions)  
    { 
     HandleMyException(); 
     return; // Returns and halt the execution of SomeFunction method. 
    } 
     SomeOtherFunction(); 
} 
+0

謝謝,但不,我不是:) – CodeAndCats