【问题标题】:Does Object = Nothing make any sense right before the Application.Exit call?Object = Nothing 在 Application.Exit 调用之前是否有意义?
【发布时间】:2017-10-29 14:42:12
【问题描述】:

我已经看过很多次了。上次我看到它时有人创建了一个 excel 应用程序对象。他就这样结束了他的申请:

myExcelObj = Nothing
Application.Exit()

我确信将引用点设为空不会关闭在后台运行的 excel 应用程序。还看到了很多不可见的对象,如下所示:

Public Class myClass
   Var1 as Integer = 0
   Var2 as SQLConnection
   Var3 as Whatever

   Public Sub New()
      Var1 = Maths.Rnd(0,1)
      Var2 = SomeStaticClass.GetSQLConnection()
      Var3 = New Whatever(Var1)
   End Sub
End Sub

(...)

// Somewhere in the Code (...)
Private Sub EndItAll(sender as Object, e as EventArgs)
    Me.My_myClassObject = Nothing
    Application.Exit()
End Sub

这有意义吗?无论如何,关闭应用程序本身不会释放所有使用过的内存吗?什么时候这样做才有意义?

【问题讨论】:

  • 这没有意义。许多 .NET 程序员并不真正了解垃圾收集器的工作原理并养成了不良习惯,尤其是在 Office 互操作代码中。 this Q+A的一些背景。
  • 一如既往地为您提供很好的回答。这将为“卢克给予汉斯·帕桑特声誉”-计数器添加另一个。谢谢。
  • 完成此操作后,我会检查是否有多个“隐藏”的 Excel 实例仍在后台(任务管理器)中运行。如果没有正确清理,Excel 互操作对象往往会使 Excel 保持运行。这可能不是这里的情况,但看起来他正在清理 VBA 样式的对象。他可能从使用 VBA 中养成了这个习惯。可能没有其他问题,但我会检查那些仍在运行的 Excel 应用程序以防万一。

标签: .net vb.net memory


【解决方案1】:

这可能会回答您的问题: https://blogs.msdn.microsoft.com/ericlippert/2004/04/28/when-are-you-required-to-set-objects-to-nothing/

但是忽略那里的那个小链接,不,这有点没有意义,至少在这个时代,就像他在帖子中所说的那样,也许是需要的旧版本。

【讨论】:

  • 感谢您的链接。所以正如我所料,它不再需要了。
  • 不客气 ;) 从经验的角度来看,我已经有几年没有在 VB.net 中编程了,但在退出应用程序之前我从来不需要这样做,它可以防止将来出现错误,但我认为永远不会存在阻止内存转储的错误,除非存在应用程序退出但进程继续运行只是因为它被锁定到文件中的错误。但是不客气;)
【解决方案2】:

在申请结束之前?毫无意义。

否则这是一种很好的做法,恕我直言。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 2018-08-06
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    相关资源
    最近更新 更多