使用 USING 创建对象并返回

7

我正在使用以下代码创建一个对象(obj),并将该对象作为函数返回的一部分。这样做会导致任何问题,例如在尝试在另一个函数中使用返回值之前,该对象被处理掉了吗?

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

我正在尝试修复像这样的代码中出现的CA2000警告。请参考http://msdn.microsoft.com/en-us/library/ms182289.aspx。 - cagatay
9个回答

18
这会导致一个问题,比如在尝试在另一个函数中使用返回值之前,对象可能已被销毁?
是的。
您能解释一下您在这里尝试做什么吗?这段代码毫无意义。 "Using" 的整个重点是你只在这里使用对象,然后自动丢弃它的稀缺非托管资源,使其无法使用。可能有更好的方法来实现您想要做的事情。

1
虽然其他答案都是正确的,但我认为向用户解释“使用”到底意味着什么非常重要,而Eric提供了这一点。 - Stan R.
我在关于我想要实现什么的问题上添加了一条评论。谢谢。 - cagatay
2
@aziz,你应该在实际使用对象的地方使用using来包装它。也就是说,你的函数可以返回一个可处理的对象。由调用函数来正确处理它。using (MyObject obj = GetDisposableObject()) { /* code */ } - Anthony Pegram

6
当对象超出作用域时,无论是通过return还是其他代码路径,它都将被Dispose()using 的唯一目的是为了提供一个故障转移机制,以使局部作用域的IDisposable对象在封闭的代码块中发生任何情况时得到清理。

这将导致您的调用函数出现问题,因此请不要这样做。


2

当你返回对象时,它的“dispose”函数会被立即调用。尽管该对象还没有被垃圾回收,但仍然可以使用。

在这种情况下,我遵循的规则是接收对象的方法负责处理其释放。你不知道这个方法何时完成对该对象的使用,因此,完成后清理对象的工作应由该方法负责。


它不应该说“因为它还没有被垃圾回收”吗? - Brian Rasmussen

1

这只是我的个人意见,可能不是最正确的,但当在一个范围内定义了一项工作并且希望使用 using 构造函数来处理对象时,应该使用 using 语句。


不应该是一种观点,而是一个事实,这就是“使用”的目的。+1 - Stan R.

0

是的,这会引起问题。如果您有这种情况(我可以想到一种返回数据库访问器类的方法),请不要使用using块,因为您不负责处理此对象的处理,而是调用者。


0

对于没有Dispose方法的对象,这可能有效,但是那样就没有使用“using”的必要了。

即使它对您特定的对象有效,也是错误的。这不是“using”结构的用途。


0

当您使用对象的消费者中出现异常时,会提示对象已被处理,因为 using 范围实际上是调用 IDisposable 实现。


0

如果您需要返回一个可释放的对象,您需要确保所有的代码路径都要么返回该对象,要么将其释放。请注意,函数抛出异常也是一种有效的代码路径。为了处理这种情况,您可能希望在创建和返回之间的代码段中使用try-catch或try-finally来确保如果未成功到达返回语句,则对象得到正确释放。


0
从技术角度来看,这取决于在实现的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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接