我们是否必须在try块内或try块外声明变量?

时间:2017-04-03 11:56:51

标签: c# .net

使用try / catch / finally声明和使用变量的最佳做法/建议是什么?。

我们是否必须在try块的外侧声明变量并在finally上进行处理?或者在try block中声明并自动处理?

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);
   }
}

2 个答案:

答案 0 :(得分:1)

这取决于您需要的范围以及您要对变量执行的操作。如果您在try块中声明它,则无法使用block之外的变量,甚至不能在catch块中使用该变量。这与catch必须处理异常情况并且finally始终能够执行的事实有关。在try范围内声明变量时,如果抛出异常,则不知道它是否已初始化。并且您永远不知道变量是否在try/catch块之后被初始化。因此,如果你想在catch / finally或更高版本的代码中使用一个变量,你可以更安全并在之前声明它(这样你总是可以确定你可以处理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!
}

答案 1 :(得分:0)

这取决于变量的类型,

如果它是任何com组件,如connection,dataReader,filestream句柄,你认为对象需要手动关闭,你应该在try之外声明它们并最终处理它们。

如果您有正常类型的变量,就像您提到的那样,它将被自动销毁,无需处置它们。

处理COM组件的更好方法是使用这样的方法。

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