2017-04-03 86 views
0

用try/catch/finally聲明和使用變量的最佳實踐/建議是什麼?我們是否必須在try塊內或try塊外部聲明變量?

做我們必須聲明變量out try塊的一側,並配置在最後?或者在try塊內聲明並自動處理?

string Name = String.Empty; 
try 
{ 
    //do work 
} 
catch 
{ 
    //safely access s 
    Console.WriteLine(Name); 
} 

OR 

string Name; 
try 
{ 
    //do work 
} 
catch 
{ 
    if (!String.IsNullOrEmpty(Name)) 
    { 
     //safely access s 
     Console.WriteLine(Name); 
    } 
} 
+3

這完全取決於... – TheLethalCoder

+4

爲什麼你期望得到一個'嘗試... catch'塊自動配置一個變量是什麼變量,哪些工作? –

+5

你的第二個例子不會被編譯,因爲'Name'在被catch塊讀入之前沒有明確的賦值。除此之外,你應該給變量儘可能小的範圍。 – Lee

回答

0

這取決於什麼類型的變量是,

如果是想連接,DataReader的,文件流處理任何COM組件,你認爲的對象需要手動關閉你應該嘗試之外聲明它們並最終配置它們。

如果你有正常類型的變量,比如你提到的弦,它就會自動銷燬不需要處理它們。

更好的處置COM組件的方法是使用這樣使用。

using(var test = new Object()) 
{//Do Coding here 
} 
1

它取決於你需要的範圍和你想要對變量做什麼。如果您在try塊內聲明它,你將無法使用變量block外,甚至沒有內catch塊。這與以下事實:catch要處理的特殊情況和finally應該總是能夠執行的事情。當您在try範圍內聲明變量時,您不知道是否在拋出異常時對其進行了初始化。你永遠不知道變量是否在你的try/catch塊之後被初始化。因此,如果你想在catch中使用一個變量,或者最後在代碼中使用一個變量,那麼你最好是安全的並且在之前聲明它(這樣你總是可以確定你可以處理finally塊中的配置)。但是,總是儘量給你的變量儘可能小的範圍。所以,如果你確信你不會需要它try範圍之外,聲明它的try內。

的話是什麼意思一個例子:

try 
{ 
    throw new SomeException("It goes wrong here"); 
    string iNeedThisVariable = "but i never get initialized"; 
} 
catch (SomeException e) 
{ 
    Console.Out.WriteLine(iNeedThisVariable); //This goes wrong, since you need to show the string, but it has never been initialized 
} 
finally 
{ 
    Console.Out.WriteLine(iNeedThisVariable); //Also can't use it here! 
}