【发布时间】:2013-08-22 14:39:33
【问题描述】:
在我的课程中,我实现IDisposable 如下:
public class User : IDisposable
{
public int id { get; protected set; }
public string name { get; protected set; }
public string pass { get; protected set; }
public User(int UserID)
{
id = UserID;
}
public User(string Username, string Password)
{
name = Username;
pass = Password;
}
// Other functions go here...
public void Dispose()
{
// Clear all property values that maybe have been set
// when the class was instantiated
id = 0;
name = String.Empty;
pass = String.Empty;
}
}
在 VS2012 中,我的代码分析说要正确实现 IDisposable,但我不确定我在这里做错了什么。
具体文字如下:
CA1063 正确实现 IDisposable 在“用户”上提供可覆盖的 Dispose(bool) 实现或将类型标记为密封。对 Dispose(false) 的调用应该只清理本机资源。对 Dispose(true) 的调用应该清理托管资源和本机资源。 stman User.cs 10
供参考:CA1063: Implement IDisposable correctly
我已经阅读了这个页面,但恐怕我不太明白这里需要做什么。
如果有人能用更通俗的语言解释问题是什么和/或应该如何实现IDisposable,那真的很有帮助!
【问题讨论】:
-
这就是
Dispose里面的所有代码吗? -
你应该实现你的 Dispose() 方法来调用你类的任何成员的 Dispose() 方法。这些成员都没有。因此,您应该不实现 IDisposable。重置属性值是没有意义的。
-
你只需要实现
IDispoable,如果你有非托管资源要处理(这包括被包装的非托管资源(SqlConnection、FileStream等)。你不需要并且不应该如果你只有像这里这样的托管资源,就不应该实现IDisposable。这是,IMO,代码分析的一个主要问题。它非常擅长检查愚蠢的小规则,但不是 i> 善于检查概念错误。 -
@Ortund 已经有大量关于一次性模式的资料。即使在这个问题的答案中,也有一些误解模式的微妙例子。最好将未来的提问者指向第一个相关的 SO 问题(有 309 个赞成票)。
-
所以不要投反对票,也不要投赞成票,将帖子保持为零并用有用的指针结束问题。
标签: c# .net memory-management memory-leaks garbage-collection