Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.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# 为什么不总是处理?_C#_Dispose - Fatal编程技术网

C# 为什么不总是处理?

C# 为什么不总是处理?,c#,dispose,C#,Dispose,我知道这个问题已经被问过了,但我的问题比我见过的其他问题更一般 当我在程序中检查窗体中控件的使用情况以及数据库的命令(命令、读卡器等)时,我想到了以下问题: 如果我有一个控件,我不应该在使用它之后处置它吗 这样,我将确保我的程序只使用所需的资源,如果我必须使用已经释放的控件,那么我将再次加载它 也许有理由不总是处理所有东西,但这就是为什么我要问这个问题 谢谢你的回答,我希望我能说清楚 您创建的非可视组件(命令、读卡器、I/O组件,基本上是实现IDisposable的任何组件)应在使用完后进行处置

我知道这个问题已经被问过了,但我的问题比我见过的其他问题更一般

当我在程序中检查
窗体中控件的使用情况以及
数据库的命令(命令、读卡器等)时,我想到了以下问题:

如果我有一个控件,我不应该在使用它之后处置它吗

这样,我将确保我的程序只使用所需的资源,如果我必须使用已经释放的控件,那么我将再次加载它

也许有理由不总是处理所有东西,但这就是为什么我要问这个问题


谢谢你的回答,我希望我能说清楚

您创建的非可视组件(命令、读卡器、I/O组件,基本上是实现
IDisposable
的任何组件)应在使用完后进行处置

对于可视控件,
表单
Dispose
函数应自动处理其
控件
集合中的所有控件,因此您只需担心出于某种原因从表单的
控件
中删除的控件


除非您遇到严重的内存问题,否则尝试手动处理表单控件可能是一种微观优化。

是的,如果没有具体的理由反对,您可能应该处理所有内容。控件在
窗体
中自动释放,并且
窗体
被释放

不处理UI资源不是很有害。只是系统资源使用量比需要的内存多一点。在大多数情况下,这不是一个功能问题


当然,这与数据库连接和文件不同!处理它们是非常关键的。

如果您使用的是非托管资源,则选择“是”。继续实施,使用将简化您的工作。但不总是,至于你的问题。您的控件(UI控件)已实现此IDisposable,并将在关闭时由其父控件调用。

是的,您应该这样做。在Windows窗体窗口(或分别在容器中)中,窗体设计器为您执行以下操作:

protected override void Dispose(bool disposing)
{
    if(disposing && (components != null))
    {
        components.Dispose();
    }
    base.Dispose(disposing);
}

你甚至没有提到或标记你正在谈论的语言。我想是的,是的。我加了标签。谢谢“如果我必须使用一个已经处理好的控件”哦,但是如果你以后必须使用的话,你不会处理掉一些东西,对吗?可能有助于你“某种程度的控制”。你能澄清一下吗?控件生命周期在大多数情况下都是所有者窗口的生命周期,因为它适合组件集合模式。“在我使用它之后”?你如何使用你的控制?要回答这个问题,请处置您在使用结束时创建的对象。如果处置是关键的,则表示某些对象已损坏。不处理应该总是可能的(而且,对于“安全”这个词的某些值来说),我不认为这是真的:想想文件被锁定了一段不确定的时间,因为文件流没有被处理。或者事务泄漏到下一个HTTP请求中,因为它没有在上一个请求中结束。这两个例子都是长期存在的稳定问题。它们会导致随机行为。它们是必须解决的问题,而这两个例子都是其他问题的例子。如果需要文件立即可用,请将其关闭。如果不希望该事务在下一个请求中处于活动状态,可以回滚或提交它。这两个例子都是滥用
Dispose
去做它不应该做的事情。它只有一个任务,而该任务不会为您回滚事务。如果您使用的是值得一提的事务,那么应该已经完成了。