哪一个:

using (var myObject = new MyClass())
{
   try
   {
      // something here...
   }
   catch(Exception ex)
   {
      // Handle exception
   }
}

OR

try
{
   using (var myObject = new MyClass())
   {
      // something here...
   }
}
catch(Exception ex)
{
   // Handle exception
}

当前回答

两者都是有效的语法。这实际上取决于您想做什么:如果您想捕获与创建/处理对象相关的错误,请使用第二种方法。如果不是,就用第一个。

其他回答

从c# 8.0开始,您可以在某些条件下简化使用语句来摆脱嵌套块,然后它只适用于封闭块。

所以你的两个例子可以简化为:

using var myObject = new MyClass();
try
{
   // something here...
}
catch(Exception ex)
{
   // Handle exception
}

And:

try
{
   using var myObject = new MyClass();
   // something here...
}
catch(Exception ex)
{
   // Handle exception
}

这两点都很清楚;然后,这将两者之间的选择减少到您希望对象的作用域是什么,您希望在哪里处理实例化错误,以及您希望在什么时候处理它。

两者都是有效的语法。这实际上取决于您想做什么:如果您想捕获与创建/处理对象相关的错误,请使用第二种方法。如果不是,就用第一个。

从c# 8.0开始,我更喜欢像这样使用第二个

public class Person : IDisposable
{
    public Person()
    {
        int a = 0;
        int b = Id / a;
    }
    public int Id { get; set; }

    public void Dispose()
    {
    }
}

然后

static void Main(string[] args)
    {

        try
        {
            using var person = new Person();
        }
        catch (Exception ex) when
        (ex.TargetSite.DeclaringType.Name == nameof(Person) &&
        ex.TargetSite.MemberType == System.Reflection.MemberTypes.Constructor)
        {
            Debug.Write("Error Constructor Person");
        }
        catch (Exception ex) when
       (ex.TargetSite.DeclaringType.Name == nameof(Person) &&
       ex.TargetSite.MemberType != System.Reflection.MemberTypes.Constructor)
        {
            Debug.Write("Error Person");
        }
        catch (Exception ex)
        {
            Debug.Write(ex.Message);
        }
        finally
        {
            Debug.Write("finally");
        }
    }

我更喜欢第二个。也可以捕获与对象创建相关的错误。

这里有一件重要的事情我要指出:第一个将不会捕获调用MyClass构造函数引起的任何异常。