Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# CA1001 Visual Studio 2012代码分析警告。这是什么意思?_C#_Code Analysis_Idisposable - Fatal编程技术网

C# CA1001 Visual Studio 2012代码分析警告。这是什么意思?

C# CA1001 Visual Studio 2012代码分析警告。这是什么意思?,c#,code-analysis,idisposable,C#,Code Analysis,Idisposable,这并不重要,但我正在试图弄清楚它告诉我什么,这是一个合理的警告吗?有人能给我简单地解释一下这个错误吗 CA1001拥有一次性字段的类型应该是一次性的 在“MemVoteManager”上实现IDisposable,因为它创建 以下IDisposable类型:“CongressDBEntities”。如果“MemVoteManager” 以前已发布,添加了实现IDisposable的新成员 对该类型的更改被视为对现有 消费者 它让您知道字段context包含一次性成员。这意味着这些成员需要调用Di

这并不重要,但我正在试图弄清楚它告诉我什么,这是一个合理的警告吗?有人能给我简单地解释一下这个错误吗

CA1001拥有一次性字段的类型应该是一次性的

在“MemVoteManager”上实现IDisposable,因为它创建 以下IDisposable类型:“CongressDBEntities”。如果“MemVoteManager” 以前已发布,添加了实现IDisposable的新成员 对该类型的更改被视为对现有 消费者


它让您知道字段
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;
}