3

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

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 块中?

4

2 回答 2

5

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

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

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

于 2013-11-07T09:02:21.807 回答
3

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

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

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

于 2013-11-07T09:03:49.543 回答