返回USING创建的对象

时间:2010-11-19 19:13:03

标签: c# dispose using

我正在创建一个对象(下面的obj)使用并返回该对象作为函数return的一部分。这会导致在我尝试在另一个函数中使用返回值之前处理像object之类的任何问题吗?

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

9 个答案:

答案 0 :(得分:17)

  

在我尝试在另一个函数中使用返回值之前,是否会导致像object这样的问题?

你能解释一下你在这里想做什么吗?这段代码没有任何意义。 “使用”的整个仅使用对象 ,然后自动删除其稀缺的非托管资源,呈现它无法使用。可能有更好的方法来做你想做的事。

答案 1 :(得分:6)

当对象超出范围时,对象将是Dispose() - d,无论是return还是其他代码路径。 using的唯一目的是为本地范围的IDisposable个对象提供故障保护机制,以便在封闭的代码块中进行清理。

这会导致你的调用函数出现问题,所以不要这样做。

答案 2 :(得分:2)

您的物品将在您退回后立即处理。它仍然在技术上可用,因为它没有被垃圾收集,但它将运行Dispose功能。

我在这个例子中遵循的规则是接收对象的方法负责处理它。你不知道该方法什么时候完成它,所以当方法完成后,该方法有责任自行整理。

答案 3 :(得分:1)

仅仅是我个人的观点,可能不是最正确的,但是当在作用域中定义工作单元并且您希望处理使用构造中的对象时,应该使用using构造。

答案 4 :(得分:0)

是的,这会导致问题。如果你有这种情况(我可以想到一个返回数据库访问器类的方法)不要使用using块,因为你不能处理这个对象,但调用者是。

答案 5 :(得分:0)

它可能适用于没有Dispose方法的对象,但是不需要使用'using'。

即使它适用于您的特定对象,也是错误的。这不是“使用”构造用于

的内容

答案 6 :(得分:0)

从技术上讲,它取决于MyObject在已实现的Dispose接口的IDisposable方法中的作用。

理论上,这可能非常好,因为你只是将事物包装在一个不必要的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

答案 7 :(得分:0)

你会在你的对象的使用者中得到一个异常,说对象基本上是处理使用范围剂量 - 调用IDisposable实现。

答案 8 :(得分:0)

如果需要返回Disposable对象,则需要确保所有代码路径都返回对象或处置它。请注意,抛出函数的异常是有效的代码路径。为了涵盖这种情况,您可能希望在创建和返回try-catch或try-finally之间包装代码段,以确保在未成功到达return语句时正确处理对象。