哪種方式更好的做法:從using
語句中的方法返回值或先聲明變量,然後將其設置並返回它?關於使用塊返回的最佳做法
public int Foo()
{
using(..)
{
return bar;
}
}
或
public int Foo()
{
var b = null;
using(..)
{
b = bar;
}
return b;
}
哪種方式更好的做法:從using
語句中的方法返回值或先聲明變量,然後將其設置並返回它?關於使用塊返回的最佳做法
public int Foo()
{
using(..)
{
return bar;
}
}
或
public int Foo()
{
var b = null;
using(..)
{
b = bar;
}
return b;
}
我更喜歡第一個例子。更少的變量,更少的代碼,更易於理解,易於維護......
public int Foo()
{
using(..)
{
return bar;
}
}
沒有理由不把自認爲using
聲明轉化爲try...finally
塊和finally
部分是保證執行的(即使是通過返回或未處理的異常)。
它真的可以歸結爲個人喜好。你會在這個特定的圍欄兩邊找到爭論。我自己,我贊成選擇1:儘快返回。我相信它更好地表達了代碼的意圖;沒有理由堅持比你更長的時間。如果您已完成所有工作,請返回。
有時,您將有多個可能的返回點和「結束方法」工作(日誌記錄,清理),這可能會導致您返回單個返回語句。沒有什麼可怕的,但你可以經常在finally
塊或處理面向方面的編程方面處理這些情況。
繼「少即是多」原則(實際上只是KISS的變體),前者。有很少的代碼行要維護,語義上沒有變化,並且不會丟失可讀性(可以說這種風格更易於閱讀)。
using語句確保 處置是即使當你調用對象的方法 發生異常 調用。通過將對象 置於try塊內,然後調用 在finally塊中進行處理,可以實現 的相同結果;實際上, 這是怎麼使用的語句是由編譯器翻譯的 。
最終是用來保證代碼 語句塊執行,無論前面的try塊是如何退出 。
要回答你的問題,是的,它可以從使用語句返回。
第二個顯然更好,你可以通過編寫測試程序來驗證它是否正常工作。
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
得到妥善處置。
我覺得第二個更好
考慮到這一點發生,而使用這種方式public int Foo()
{
using(..)
{
return bar;
}
}
的一件事是,我們之間的使用,以便將對象(我們已經包裹在使用),將得到處置返回在,答案是肯定的 因爲A使用語句只是try/finally塊的混合,所以也可以從try塊返回。返回表達式將被評估,然後finally塊將被執行,並且方法將會返回then.So前進:)
有人總是要指出 - 最終塊是*不* *「保證」被執行在所有。有明確的情況下會執行,其他情況下不會。 – 2009-08-03 18:30:17
有一些它不會的例子嗎? – 2009-08-03 18:31:38
@Earwicker:如果不會被執行的情況達到<0.01%,那麼我認爲對於大多數目的而言,我們可以說它是「有保證的」。 – 2009-08-03 18:31:39