在这种情况下我真的应该实施 IDisposable 吗?
Should I really implement IDisposable in this case?
我目前在开发 C# 应用程序时使用 NDepend。我违反了一条规定 "Types with disposable instance fields must be disposable".
我知道当你做这样的事情时,你实际上应该这样做:
class SomeClass : IDisposable
{
private Control _someControl; // implements IDisposable
public SomeClass()
{
_someControl = new RandomControl();
}
// ...
}
但是,我在处理程序 class 中遇到了这样的违规行为:
public class SomeHandler
{
private Control _someControl; // implements IDisposable
public SomeHandler(Control control)
{
_someControl = control;
}
public void SomeMethod()
{
DoSomethingWith(_someControl);
}
// ...
}
处理程序对象应该与控件一样长。在这种情况下我真的应该实施 IDisposable 吗?在所有情况下,处理程序 class 不应该负责处理存储的控件(而是首先创建控件的 class)。
如果您没有 "object" 的所有权,则不得处置它。
有一些 classes(例如 StreamReader
)有一个配置选项来告诉他们是否应该获得您传递给他们的 Stream
的所有权。显然 StreamReader
必须是 IDisposable
并做一些逻辑检查
例如:https://msdn.microsoft.com/library/gg712952.aspx
public StreamReader(
Stream stream,
Encoding encoding,
bool detectEncodingFromByteOrderMarks,
int bufferSize,
bool leaveOpen
)
更相似的是:PictureBox class 没有取得 Image
传递的所有权。如果将 Image
替换为另一个 Image
,则 Image
必须由控件 and/or 的 creator/owner 处理(设置 属性 Image
) 由执行操作的人执行。
请注意,在 C# 中,无法知道控件是否应该 take/has 某物的所有权。只能写在文档里。
我目前在开发 C# 应用程序时使用 NDepend。我违反了一条规定 "Types with disposable instance fields must be disposable".
我知道当你做这样的事情时,你实际上应该这样做:
class SomeClass : IDisposable
{
private Control _someControl; // implements IDisposable
public SomeClass()
{
_someControl = new RandomControl();
}
// ...
}
但是,我在处理程序 class 中遇到了这样的违规行为:
public class SomeHandler
{
private Control _someControl; // implements IDisposable
public SomeHandler(Control control)
{
_someControl = control;
}
public void SomeMethod()
{
DoSomethingWith(_someControl);
}
// ...
}
处理程序对象应该与控件一样长。在这种情况下我真的应该实施 IDisposable 吗?在所有情况下,处理程序 class 不应该负责处理存储的控件(而是首先创建控件的 class)。
如果您没有 "object" 的所有权,则不得处置它。
有一些 classes(例如 StreamReader
)有一个配置选项来告诉他们是否应该获得您传递给他们的 Stream
的所有权。显然 StreamReader
必须是 IDisposable
并做一些逻辑检查
例如:https://msdn.microsoft.com/library/gg712952.aspx
public StreamReader(
Stream stream,
Encoding encoding,
bool detectEncodingFromByteOrderMarks,
int bufferSize,
bool leaveOpen
)
更相似的是:PictureBox class 没有取得 Image
传递的所有权。如果将 Image
替换为另一个 Image
,则 Image
必须由控件 and/or 的 creator/owner 处理(设置 属性 Image
) 由执行操作的人执行。
请注意,在 C# 中,无法知道控件是否应该 take/has 某物的所有权。只能写在文档里。