在我的项目中,我有一个构造函数可以抛出的对象。所以我正在使用的代码如下:
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块吗?
答案 0 :(得分:5)
问题是:我可以以某种方式使CLR将对象的构造函数放入try块中吗?
没有。或者说,从资源管理的角度来看,这样做毫无意义。如果构造函数抛出异常,那么就不会成为分配给obj
的引用,因此无法调用Dispose
。
至关重要的是,如果构造函数抛出异常,它会处理它分配的任何资源,因为调用者无法实现。
答案 1 :(得分:3)
不,你不能这样做,这是using
并且它以这种方式工作。你必须自己编写你需要的代码
值得一提的是,在类型的ctor
中有异常,根本不是一个好主意,所以如果可能的话,可能会将可能引发异常的代码移动到另一个地方。最好还有一个方法,并限制你的类型的消费者明确地调用它来实现某些事情并控制情况,然后像你描述的情况那样。
通常,仅使用ctor
构造给定类型的实例并初始化内部值。