我需要处理短暂的一次性对象吗?

4

我有一个类,创建了几个可释放对象,然后将这些对象传递给第三方库中的另一个“管理器”类。由于我需要在后续调用中使用其中一些对象,因此我保留了对创建对象的本地字段引用,以便稍后访问它们。当我在该类上运行FxCop时,它说我应该实现IDisposable,因为我保留了对可释放对象的引用。我的问题是:

  1. 我应该为我的类实现IDisposable吗?(还是由管理器负责?)
  2. 如果是这样,我只应该处理我保留引用的对象吗?还是应该找到一种方法来处理我创建的所有对象。

我的代码:

public class MyClass  
{  
    ClassThatIsDisposable aReference;  
}

public MyClass(ManagerClass manager)  
{  
    ClassThatIsDisposable transient=new ClassThatIsDisposable();  
    manager.Add(transient);  
    aReference=new ClassThatIsDisposable();  
    manager.Add(aReference);  
}

public void LaterCall()  
{  
    areference.Method();  
}  
  

兄弟,我写了一篇完整的文章和一个演示项目来问同一个问题。谢天谢地,这个已经有人做过了。我正好遇到了类似的问题。 - dance2die
2个回答

2
拥有该对象的类应该负责处理它们...听起来您的经理是所有者,所以他应该处理该对象。
如果您试图避免FXCop警告,则一种选择是让MyClass每次需要使用时从经理请求可处理对象。这样,您就不会有一个成员变量持有对它的引用。您可以通过使Add()方法返回已添加对象的密钥,然后在需要使用它时使用此密钥从管理器中检索对象来实现此操作。

1

如果您创建了任何一次性对象,您应该自己处理它们或确保将它们交给另一个类来负责处理。

在这种情况下,我认为这取决于管理类将要做什么。如果它保证会处理添加到其中的任何内容,那么就没问题了。不过,这看起来是一种有点奇怪的设计模式 - 我不能说我自己使用过类似的东西。这并不意味着它一定是错误/不好的,但至少值得再看一眼,看看是否有避免所有权轻微混淆的方法。

请记住,如果管理器处理您持有引用的对象,那么之后很可能无法使用它。


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