3

C# 中的 .Dispose() 是否等同于 C 中的 free()?

在获得用户选择的文件名后,我应该 .Dispose() 一个 OpenFileDialog 吗?

在我的应用程序中,用户可以随心所欲地选择/打开文件,那么将 openFileDialog 实例留在内存中而不丢弃它不是更有意义吗?或者由于 .NET 框架的特定架构,这会是一种不好的做法吗?

4

4 回答 4

3

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

using (var myInstanceOfSomeClass = new SomeClassImplementingIDisposable())
{
    // do stuff
}

这是调用 .Dispose() 的 try/finally 块的 C# 简写。

至于它与 free() 的关系,我不认为它们是相同的。我的 C 生锈了,但 .Dispose() 是一个更通用的实现,可以清理非托管资源,例如文件句柄、数据库连接、内存分配等。 .Dispose() 对任何给定类的确切作用取决于实现由开发商。

于 2013-10-31T17:26:33.987 回答
2

不。

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

阅读有关界面的信息IDisposable

于 2013-10-31T17:26:12.090 回答
0

不。

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

在 C 中 free() 仅用于释放先前已分配的内存。

在 C# 流中,Close 方法将调用 Dispose,通常建议将流 I/O 包含在“using(...)”语句中。

于 2013-10-31T17:30:22.047 回答
-1

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

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

请注意,虽然人们通常会考虑“关闭”文件而不是“处置”它,但始终IDisposable为大多数类型的对象使用接口,这些对象要求其他实体代表他们做某事,这允许 VB.NET 和 C#提供一个using构造,例如

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

这将在退出时自动让任何已开始代表受保护对象执行某些操作的对象知道它们不再需要这样做(VB.NET 或 C# 将调用Dispose受保护对象,然后它会知道谁需要通知什么)。如果需要Close文件、DeleteGDI 对象、Release互斥体、Shutdown守护程序服务等,那么语言很难知道using退出时语句应该如何处理其受保护的对象。有一个Dispose方法可以做任何合适的事情,大大简化了这样的结构。

于 2013-10-31T18:04:52.673 回答