我正在开发C#应用程序时使用NDepend。我违反规则,声明“带有一次性实例字段的类型必须是一次性的”。
我知道当你做这样的事情时,你应该这样做:
class SomeClass : IDisposable
{
private Control _someControl; // implements IDisposable
public SomeClass()
{
_someControl = new RandomControl();
}
// ...
}
但是,我在这样的处理程序类中得到了违规行为:
public class SomeHandler
{
private Control _someControl; // implements IDisposable
public SomeHandler(Control control)
{
_someControl = control;
}
public void SomeMethod()
{
DoSomethingWith(_someControl);
}
// ...
}
处理程序对象应该与控件一样长。在这种情况下我真的应该实现IDisposable吗?在所有情况下,处理程序类不应该负责处理存储的控件(而是首先创建控件的类)。
答案 0 :(得分:3)
如果您不拥有"对象"你不能处置它。
有一些类(例如StreamReader
)有一个配置选项来告诉他们是否应该取得你传递它们的Stream
的所有权。显然StreamReader
必须是IDisposable
并进行逻辑检查
例如:https://msdn.microsoft.com/library/gg712952.aspx
public StreamReader(
Stream stream,
Encoding encoding,
bool detectEncodingFromByteOrderMarks,
int bufferSize,
bool leaveOpen
)
更相似的内容:PictureBox课程并未取得所通过的Image
的所有权。 Image
必须由控件的创建者/所有者处理和/或将Image
替换为另一个Image
,(将属性Image
设置为)做了这个操作。
请注意,在C#中,无法知道控件是否应该拥有/拥有某些东西。您只能在文档中编写它。