C# C中的Dispose()与C中的free()等价吗

C# C中的Dispose()与C中的free()等价吗,c#,idisposable,C#,Idisposable,C中的处置是否等同于C中的自由处置 在获得用户选择的文件名后,是否应处理OpenFileDialog 在我的应用程序中,用户可以随心所欲地选择/打开一个文件,因此将openFileDialog实例留在内存中而不处理它是否更有意义?或者,由于.NET framework的特定体系结构,这是一种糟糕的做法吗 没有 dispose释放与该对象关联的资源,但不删除它。C通过垃圾收集器管理对象,垃圾收集器负责从代码中删除不再使用的对象 阅读有关IDisposable接口的信息。您应该处理任何实现IDisp

C中的处置是否等同于C中的自由处置

在获得用户选择的文件名后,是否应处理OpenFileDialog

在我的应用程序中,用户可以随心所欲地选择/打开一个文件,因此将openFileDialog实例留在内存中而不处理它是否更有意义?或者,由于.NET framework的特定体系结构,这是一种糟糕的做法吗

没有

dispose释放与该对象关联的资源,但不删除它。C通过垃圾收集器管理对象,垃圾收集器负责从代码中删除不再使用的对象


阅读有关IDisposable接口的信息。

您应该处理任何实现IDisposable的东西。通常,这意味着将上下文包装到using语句中,即:

using (var myInstanceOfSomeClass = new SomeClassImplementingIDisposable())
{
    // do stuff
}
这是调用.Dispose的try/finally块的C简写

至于它与自由的关系,我认为它们是不同的。My C已经过时了,但是.Dispose是一个更通用的实现,它可以清理非托管资源,如文件句柄、数据库连接、内存分配等。Dispose对任何给定类的具体作用取决于开发人员的实现。

Dispose仅在实现IDisposable接口的对象上可用。大多数事情都不需要它。它的目的是为类的创建者提供一种方式,在使用者使用完对象后,通知该对象需要特别注意清理资源。这可能是内存,但通常是某种形式的连接或特殊资源端口、文件等

在C中,free仅用于释放先前分配的内存

在C streams中,Close方法将调用Dispose,通常建议将流I/O封装在“using…”语句中

Dispose的目的不是销毁对象,而是让对象通知任何外部实体或可能代表其做某事的实体它不再需要这样做。例如,封装文件的对象可能会要求操作系统提供一个句柄,以授予对该文件的独占访问权。在拥有句柄的实体表示不再需要该文件之前,操作系统将不允许任何没有句柄的实体访问该文件。如果对象不再存在,而不通知操作系统不再需要独占访问,那么操作系统可能会不必要地阻止其他任何人使用该文件,至少在应用程序关闭之前是这样

NET Framework允许对象在意外放弃时请求通知,顺便说一句,包括System.IO.File在内的一些对象将使用此类通知让外部实体知道不再需要它们的服务。不幸的是,通常无法保证从一个对象被放弃到它被通知的时间间隔。虽然让系统最终确定不再需要某个文件可能比永远保存该文件要好,但及时关闭该文件要好得多

请注意,虽然人们通常会考虑关闭文件,而不是处理文件,但对于大多数类型的对象(这些对象要求其他实体代表它们做一些事情),一致使用IDisposable接口允许VB.NET和C提供使用构造,例如

using var myFile = File.Open(whatever)
{
  myFile.doStuff();
}

它将在退出时自动让任何已开始代表受保护对象执行操作的对象知道它们不再需要执行此操作。VB.NET或C将调用受保护对象上的Dispose,然后该对象将知道需要通知哪些对象。如果有必要关闭文件、删除GDI对象、释放互斥体、关闭守护程序服务等,那么语言很难知道using语句在退出时应该如何处理其受保护的对象。使用一个单独的Dispose方法来执行这些操作中的任何一项都会大大简化此类构造。

如果我不动态创建OpenFileDialog,而是在表单上拖动OpenFileDialog控件,那么OpenFileDialog何时分配了资源,何时处理这些资源?是否仍需要手动执行此操作?如果将控件拖到窗体上,它将作为窗体类中的实例变量进行维护。表单关闭后不久,它最终会被垃圾收集,所以我通常不会担心。有趣的是,没有MSDN OpenFileDialog示例调用Dispose。即使是OpenFileDialog实例,也是动态创建的?是的。我也从未为OpenFileDialog调用过它。。。完成我的句子-P