2009-08-03 40 views
8

哪種方式更好的做法:從using語句中的方法返回值或先聲明變量,然後將其設置並返回它?關於使用塊返回的最佳做法

public int Foo() 
{ 
    using(..) 
    { 
    return bar; 
    } 
} 

public int Foo() 
{ 
    var b = null; 
    using(..) 
    { 
    b = bar; 
    } 
    return b; 
} 

回答

9

我更喜歡第一個例子。更少的變量,更少的代碼,更易於理解,易於維護......

public int Foo() 
{ 
    using(..) 
    { 
    return bar; 
    } 
} 
2

沒有理由不把自認爲using聲明轉化爲try...finally塊和finally部分是保證執行的(即使是通過返回或未處理的異常)。

+1

有人總是要指出 - 最終塊是*不* *「保證」被執行在所有。有明確的情況下會執行,其他情況下不會。 – 2009-08-03 18:30:17

+1

有一些它不會的例子嗎? – 2009-08-03 18:31:38

+1

@Earwicker:如果不會被執行的情況達到<0.01%,那麼我認爲對於大多數目的而言,我們可以說它是「有保證的」。 – 2009-08-03 18:31:39

1

它真的可以歸結爲個人喜好。你會在這個特定的圍欄兩邊找到爭論。我自己,我贊成選擇1:儘快返回。我相信它更好地表達了代碼的意圖;沒有理由堅持比你更長的時間。如果您已完成所有工作,請返回。

有時,您將有多個可能的返回點和「結束方法」工作(日誌記錄,清理),這可能會導致您返回單個返回語句。沒有什麼可怕的,但你可以經常在finally塊或處理面向方面的編程方面處理這些情況。

5

繼「少即是多」原則(實際上只是KISS的變體),前者。有很少的代碼行要維護,語義上沒有變化,並且不會丟失可讀性(可以說這種風格更易於閱讀)。

5

using Statement - MSDN

using語句確保 處置是即使當你調用對象的方法 發生異常 調用。通過將對象 置於try塊內,然後調用 在finally塊中進行處理,可以實現 的相同結果;實際上, 這是怎麼使用的語句是由編譯器翻譯的 。

try-finally (C# Reference)

最終是用來保證代碼 語句塊執行,無論前面的try塊是如何退出

要回答你的問題,是的,它可以從使用語句返回。

3

第二個顯然更好,你可以通過編寫測試程序來驗證它是否正常工作。

using聲明本身不能有一個值,這是一個限制。假設你有一個名爲Open返回一個開放的FileStream方法,以及你想要得到的文件長度:

Console.WriteLine(Open().Length); 

該缺陷存在,你是不是在處置FileStream。所以,你必須寫(類似你的例子):

long length; 

using (FileStream file = Open()) 
    length = file.Length; 

Console.WriteLine(length); 

但有simple extension method,可以改爲寫:

Console.WriteLine(Open().Use(file => file.Length)); 

尼斯和整潔,以及FileStream得到妥善處置。

1

我覺得第二個更好

考慮到這一點發生,而使用這種方式
public int Foo() 
{ 
    using(..) 
    { 
    return bar; 
    } 
} 

的一件事是,我們之間的使用,以便將對象(我們已經包裹在使用),將得到處置返回在,答案是肯定的 因爲A使用語句只是try/finally塊的混合,所以也可以從try塊返回。返回表達式將被評估,然後finally塊將被執行,並且方法將會返回then.So前進:)