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
去做它不应该做的事情。它只有一个任务,而该任务不会为您回滚事务。如果您使用的是值得一提的事务,那么应该已经完成了。