C# CA1001 Visual Studio 2012代码分析警告。这是什么意思?
这并不重要,但我正在试图弄清楚它告诉我什么,这是一个合理的警告吗?有人能给我简单地解释一下这个错误吗 CA1001拥有一次性字段的类型应该是一次性的 在“MemVoteManager”上实现IDisposable,因为它创建 以下IDisposable类型:“CongressDBEntities”。如果“MemVoteManager” 以前已发布,添加了实现IDisposable的新成员 对该类型的更改被视为对现有 消费者C# CA1001 Visual Studio 2012代码分析警告。这是什么意思?,c#,code-analysis,idisposable,C#,Code Analysis,Idisposable,这并不重要,但我正在试图弄清楚它告诉我什么,这是一个合理的警告吗?有人能给我简单地解释一下这个错误吗 CA1001拥有一次性字段的类型应该是一次性的 在“MemVoteManager”上实现IDisposable,因为它创建 以下IDisposable类型:“CongressDBEntities”。如果“MemVoteManager” 以前已发布,添加了实现IDisposable的新成员 对该类型的更改被视为对现有 消费者 它让您知道字段context包含一次性成员。这意味着这些成员需要调用Di
它让您知道字段
context
包含一次性成员。这意味着这些成员需要调用Dispose()
,以便进行垃圾收集。因此,它希望您在MemVoteManager
上实现接口IDisposable
,以便您可以在可丢弃的上下文和/或其成员上调用Dispose()
因此,请修改您的代码,如下所示:
public class MemVoteManager : AbstractDataManager, IMemVoteManager, IDisposable
然后实现IDisposable
接口的成员,如下所示:
public void Dispose()
{
// call dispose on the context and any of its members here
}
您可以实现IDisposable
,这样当使用者处理完您的类时,上下文将被处理掉,但是您最好不要让上下文成为类的成员。只需在需要时创建,并在完成后处理即可:
public int AddMemVote(tMemVoteScore mvs)
{
//Insert Model
using(CongressDBEntities context = new CongressDBEntities())
{
context.tMemVoteScores.Add(mvs);
context.SaveChanges();
int newPK = mvs.MemVoteScoresID;
//Update funky column ID with PK as well
var memVoteItem = (from m in context.tMemVoteScores
where m.MemVoteScoresID == newPK
select m).SingleOrDefault();
memVoteItem.ID = memVoteItem.MemVoteScoresID;
context.SaveChanges();
}
return newPK;
}
上下文是轻量级的,因此每次创建它们都不会受到很大的惩罚。此外,您不必担心消费者通知您处理上下文,而且如果一个类的实例被多次使用,您的内存中也不会有太多的内置更改。如果不重复该警告,就很难解释该警告告诉您要做什么。由于您的类型有一个字段,在该字段中它构造一个对象并存储到其中,该对象在该字段中实现IDisposable,因此您也应该在您的类型上实现IDisposable,并在该字段中处理该对象。这基本上就是警告所说的。突破性的变化是,任何使用您的类型的现有代码都不会在构建时考虑到
Dispose
,因此这是一个突破性的变化。但我认为在超出范围后,所有内容最终都会被垃圾收集?但如果这样做可以进行代码分析的话,我会继续像上面那样包装它happy@punkouter,这个思考过程的问题是,有很多方法对象永远不会到达垃圾收集。内存管理虽然在.NET中是自动化的,但也不是轻率的。考虑一个类,该类引用另一个类,该类也由一个永远存在的对象引用。我知道这似乎是一个边缘案件,但事实并非如此。在应用程序关闭之前,这些对象都不会被垃圾收集。确定。所以实现I Disposable并调用它是确保类将被垃圾收集的一种方法。。。也许现在不需要它,但始终以任何方式实施它是最佳实践incase@punkouter无论如何,上下文都将被垃圾收集。实现IDisposable
可以让您控制何时释放某些资源。例如,处理上下文将关闭基础数据库连接。如果等待垃圾回收,则无法控制连接何时关闭。因此,我的类中实现Idisposable的任何类都意味着我也需要实现Idisposable?如果没有它,我可以创建内存泄漏吗?就像我上面提到的,我认为所有的东西都是垃圾收集的。。它的托管代码@punkouter,如果类实现了IDisposable
,则明确表示它有非托管资源要处理。例如,数据库连接(实际连接)-这是一个非托管资源。因此,由于您有一个context对象,该对象具有最终导致非托管资源的其他对象,因此您需要确保对它们调用Dispose()
。但是使用“using”包装DBcontext与实现idisposable?@punkouter相同,这是正确的,但这也是假设你把它从那个类中拉出来并直接使用它。
public int AddMemVote(tMemVoteScore mvs)
{
//Insert Model
using(CongressDBEntities context = new CongressDBEntities())
{
context.tMemVoteScores.Add(mvs);
context.SaveChanges();
int newPK = mvs.MemVoteScoresID;
//Update funky column ID with PK as well
var memVoteItem = (from m in context.tMemVoteScores
where m.MemVoteScoresID == newPK
select m).SingleOrDefault();
memVoteItem.ID = memVoteItem.MemVoteScoresID;
context.SaveChanges();
}
return newPK;
}