Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.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# 处置问题,是否应忽略Visual Studio警告?_C#_Winforms_Dispose - Fatal编程技术网

C# 处置问题,是否应忽略Visual Studio警告?

C# 处置问题,是否应忽略Visual Studio警告?,c#,winforms,dispose,C#,Winforms,Dispose,我创建了一个从面板继承的用户控件。 我有一堆钢笔和刷子,VS警告我CA2213:应处理一次性字段 我有这个方法: protected override void Dispose(bool disposing) { if (disposing && (components != null)) { myPen?.Dispose(); myBrush?.Dispose(); // etc... compon

我创建了一个从面板继承的用户控件。 我有一堆钢笔和刷子,VS警告我CA2213:应处理一次性字段

我有这个方法:

protected override void Dispose(bool disposing)
{
    if (disposing && (components != null))
    {
        myPen?.Dispose();
        myBrush?.Dispose();
        // etc...
        components.Dispose();
    }
    base.Dispose(disposing);
}
我做错了什么?谢谢你的回答

编辑:

我通过覆盖my user控件中的Dispose并释放所有IDisposable字段来抑制警告

protected new void Dispose() 
{
    if (!disposed)
    {
       myPen?.Dispose();
       // etc..
       disposed = true;
    }

    base.Dispose(disposed);
}
请让我知道,如果我做的事情是正确的

编辑2:

我可以接受答案,但是第一个代码示例正确吗

if (disposing && (components != null))
从类如何工作的其他知识来看,组件为null意味着不需要其他处理,这可能是完全合理的,但是给出警告的分析不会捕捉到这一点

protected new void Dispose()
这是无用的,因为它不会被调用

我可能会选择:

protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        myPen?.Dispose();
        myBrush?.Dispose();
        // etc...
        components?.Dispose();
    }

    base.Dispose(disposing);
}

尽管注意到了?。而一个非常好的想法有时也会给出错误的警告。o如果您知道components==null意味着不需要处理,那么您的初始代码就可以了,只需禁用警告。

为什么components会为null,为什么不允许处理其他字段?因为类是部分的,并且代码已经生成,所以只需将disposed调用添加到绘图材料中即可,卸下组件!=null和更改组件。处置;对组件?进行处理;同样的结果,但我知道如何删除警告。我编辑了我的帖子。欢迎任何有建设性的评论:您的新代码隐藏了Dispose方法,而不是重写它。它永远不会被呼叫。谢谢你的回复。是的,我已经删除了那个部分,因为我只有一个计时器的容器,我使用了System.Timers.Timer来代替,并使用了那个方法。解决了,非常感谢!