我正在使用以下代码创建一个对象(obj),并将该对象作为函数返回的一部分。这样做会导致任何问题,例如在尝试在另一个函数中使用返回值之前,该对象被处理掉了吗?
using (MyObject obj = new MyObject())
{
.
.
.
return obj;
}
using
来包装它。也就是说,你的函数可以返回一个可处理的对象。由调用函数来正确处理它。using (MyObject obj = GetDisposableObject()) { /* code */ }
- Anthony Pegramreturn
还是其他代码路径,它都将被Dispose()
。 using
的唯一目的是为了提供一个故障转移机制,以使局部作用域的IDisposable
对象在封闭的代码块中发生任何情况时得到清理。
这将导致您的调用函数出现问题,因此请不要这样做。
当你返回对象时,它的“dispose”函数会被立即调用。尽管该对象还没有被垃圾回收,但仍然可以使用。
在这种情况下,我遵循的规则是接收对象的方法负责处理其释放。你不知道这个方法何时完成对该对象的使用,因此,完成后清理对象的工作应由该方法负责。
这只是我的个人意见,可能不是最正确的,但当在一个范围内定义了一项工作并且希望使用 using 构造函数来处理对象时,应该使用 using 语句。
是的,这会引起问题。如果您有这种情况(我可以想到一种返回数据库访问器类的方法),请不要使用using
块,因为您不负责处理此对象的处理,而是调用者。
对于没有Dispose方法的对象,这可能有效,但是那样就没有使用“using”的必要了。
即使它对您特定的对象有效,也是错误的。这不是“using”结构的用途。
当您使用对象的消费者中出现异常时,会提示对象已被处理,因为 using 范围实际上是调用 IDisposable 实现。
如果您需要返回一个可释放的对象,您需要确保所有的代码路径都要么返回该对象,要么将其释放。请注意,函数抛出异常也是一种有效的代码路径。为了处理这种情况,您可能希望在创建和返回之间的代码段中使用try-catch或try-finally来确保如果未成功到达返回语句,则对象得到正确释放。
IDisposable
接口的Dispose
方法中MyObject
的操作。理论上讲,这可能是完全可以的,因为你只是在一个不必要的try/catch/finally块中包装东西。public void DoStuff()
{
MyObject myObject = GetMyObject();
Console.WriteLine("Name: " + myObject.Name);
}
private MyObject GetMyObject()
{
using (MyObject obj = new MyObject())
{
obj.Name = "Aaron";
return obj;
}
}
public class MyObject : IDisposable
{
public String Name { get; set; }
#region IDisposable Members
public void Dispose()
{
//depends what you do in here...
}
#endregion
}
姓名:Aaron