【问题标题】:Using block: object initialization compiled into try blockusing 块:对象初始化编译成 try 块
【发布时间】:2013-11-07 09:00:20
【问题描述】:

在我的项目中,我有一个构造函数可以抛出的对象。所以我使用的代码如下:

MyObject obj = null;
try
{
    obj = new MyObject();
    obj.DoSomething();
}
finally
{
    if (obj != null)
        obj.Free();
}

正如Uses of "using" in C#中的意思,代码如下

using (MyObject obj = new MyObject())
{
    obj.DoSomething();
}

由 .NET CLR 转换为

{
    MyObject obj = new MyObject();
    try
    {
        obj.DoSomething();
    }
    finally
    {
        if (obj != null)
            ((IDisposable)obj).Dispose();
    }
}

问题是:我能否让 CLR 将对象的构造函数放入 try 块中?

【问题讨论】:

  • 如果您在对象初始化周围需要Try/Catch,您需要自己添加。
  • "重点是"....?
  • 是的,对不起“关键点”
  • @TimSchmelter 我的目标是用“使用”语句重写代码。 Try/Catch 就是现在的工作方式

标签: c# clr using try-finally


【解决方案1】:

问题是:我能否让 CLR 将对象的构造函数放入 try 块中?

没有。或者更确切地说,从资源管理的角度来看,这样做是没有意义的。如果构造函数抛出异常,则不会分配给obj 的引用,因此不会调用Dispose

至关重要的是,如果构造函数抛出异常,它会释放它分配的所有资源,因为调用者将无法这样做。

【讨论】:

    【解决方案2】:

    不,您不能这样做,因为这是using,它以这种方式工作。你必须自己编写你需要的代码

    值得一提的是,在类型的ctor 中出现异常根本不是一个好主意,因此,如果可能的话,将可能引发异常的代码移到另一个地方。最好再有一种方法并限制您的类型的消费者显式调用它,以实现某些目标并控制情况,然后有您描述的情况。

    一般来说,ctor 仅用于构造给定类型的实例和初始化内部值。

    【讨论】:

      猜你喜欢
      • 2014-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-31
      • 2018-07-24
      • 1970-01-01
      • 2022-11-30
      相关资源
      最近更新 更多