繁体   English   中英

使用block:将对象初始化编译成try块

[英]Using block: object initialization compiled into try block

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

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

正如在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块中吗?

问题是:我可以以某种方式使CLR将对象的构造函数放入try块中吗?

不,或者说,从资源管理的角度来看,这样做毫无意义。 如果构造函数抛出异常,那么就不会有一个分配给obj的引用,所以没有什么可以调用Dispose

至关重要的是,如果构造函数抛出异常,它会处理它分配的任何资源,因为调用者将无法执行。

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

值得一提的是,在类型的ctor中有异常,根本不是一个好主意,所以如果可能的话,可能会将可能引发异常的代码移动到另一个地方。 最好还有一个方法,并限制你的类型的消费者明确地调用它来实现某些事情并控制情况,然后像你描述的情况那样。

通常,使用ctor仅用于构造给定类型的实例和内部值的初始化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM