在我的类中,我实现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在"User"上提供Dispose(bool)的可重写实现或将类型标记为密封。调用Dispose(false)应仅清除本机资源。调用Dispose(true)应同时清除托管资源和本机资源。stman User.cs 10
供参考:CA1063: Implement IDisposable correctly
我已经通读了这一页,但恐怕我真的不明白这里需要做些什么。
如果有人能用更外行的术语解释问题所在和/或IDisposable
应该如何实现,那将非常有帮助!
8条答案
按热度按时间bhmjp9jg1#
这是正确的实现,尽管我在你发布的代码中没有看到任何需要处理的东西。你只需要在以下情况下实现
IDisposable
:1.您拥有非托管资源
1.你一直在引用那些本身就是一次性的东西。
您发布的代码中没有任何内容需要释放。
t0ybt7op2#
首先,你不需要“清理”
string
和int
--它们将由垃圾收集器自动处理,在Dispose
中唯一需要清理的是实现IDisposable
的非托管资源或托管资源。但是,假设这只是一个学习练习,那么实现
IDisposable
的 * 推荐 * 方法是添加一个“安全锁”,以确保任何资源不会被释放两次:gzszwxb43#
以下示例显示了实现
IDisposable
接口的一般最佳实践。Reference请记住,只有当类中有非托管资源时,才需要析构函数(终结器)。如果添加析构函数,则应在Dispose中取消Finalization,否则将导致对象在内存中驻留的时间比它应该驻留的时间长(注意:Read how Finalization works)。下面的例子详细说明了以上所有内容。
at0kjp5o4#
IDisposable
的存在为您提供了一种清理 unmanaged 资源的方法,这些资源不会被垃圾收集器自动清理。所有你正在清理的资源都是托管资源,因此你的
Dispose
方法什么也做不了。你的类根本不应该实现IDisposable
。垃圾收集器会自己处理好所有这些字段。puruo6ea5#
您需要按如下方式使用一次性模式:
luaexgnf6#
你不需要把你的
User
类做为IDisposable
,因为类 * 不获取 * 任何非托管资源(文件、数据库连接等)。通常,如果类至少有一个IDisposable
字段或/和属性,我们就把类标记为IDisposable
。在实现IDisposable
时,最好按照微软的典型方案来放置:uplii1fm7#
Idisposable是在需要确定性(确认)垃圾收集时实现。
创建和使用Users类时,使用“using”块以避免显式调用dispose方法:
using块创建的Users对象的结尾将通过dispose方法的隐式调用来释放。
wf82jlnq8#
我看到了很多Microsoft Dispose模式的例子,它实际上是一个反模式。正如许多人指出的,问题中的代码根本不需要IDisposable。但是如果你要实现它,请不要使用Microsoft模式。更好的答案是遵循本文中的建议:
https://www.codeproject.com/Articles/29534/IDisposable-What-Your-Mother-Never-Told-You-About
另外唯一可能有用的方法是取消代码分析警告... https://learn.microsoft.com/en-us/visualstudio/code-quality/in-source-suppression-overview?view=vs-2017