首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何终止/销毁类变量

如何终止/销毁类变量
EN

Stack Overflow用户
提问于 2016-04-02 23:15:52
回答 1查看 605关注 0票数 0

我有一个程序,它使用某种类型的Ole连接来建立与Cam/cad软件Powershape的连接。它使用一个类变量与powershape建立连接,它的属性包含有关打开的模型的信息。

问题是,只有当类变量结束或超出范围时,此连接才结束。

代码语言:javascript
复制
Dim powershapeRoot As New PSAutomation(Delcam.ProductInterface.InstanceReuse.UseExistingInstance)

这在Sub中工作得很好,因为它超出了范围,但当您需要来自powershape的数据时,此程序需要您多次执行此操作,并且每次可能需要一些时间才能再次建立连接。因此,您可以将其设置为全局变量,这样您只需要连接一次。

代码语言:javascript
复制
Dim powershapeRoot As New PSAutomation(Delcam.ProductInterface.InstanceReuse.UseExistingInstance)
Powershapeglobal = powershapeRoot

但是现在,这个变量只有在程序关闭后才会超出作用域。我试着使用:

代码语言:javascript
复制
Powershapeglobal.dispose
Powershapeglobal = nothing

这些都没有帮助,而且这种联系似乎仍然存在,因为变量仍然存在?如何永久销毁变量?

EN

回答 1

Stack Overflow用户

发布于 2016-04-03 02:31:48

在.NET中,当.NET变量超出作用域时,不会销毁非托管资源。当垃圾收集器将它们从内存中删除时,只要垃圾收集器觉得有必要,它们就会被销毁。这被称为“非确定性完成”,因为开发人员并不确定对象完成的确切时刻。

要确保外部资源在使用完毕后被清除,请调用相关对象的Dispose()方法:

代码语言:javascript
复制
  Dim powershapeRoot As New PSAutomation(Delcam.ProductInterface.InstanceReuse.UseExistingInstance)

并且,当您想要释放连接时:

代码语言:javascript
复制
  powershapeRoot.Dispose();

或者,要让Dispose自动发生,可以使用.NET "Using“语句:

代码语言:javascript
复制
 Using powershapeRoot As New PSAutomation(Delcam.ProductInterface.InstanceReuse.UseExistingInstance)



 End Using ' Dispose is called automatically here

现在,对于COM对象,该过程还有另一个步骤,您必须显式调用ReleaseComObject()方法,如下所示:

代码语言:javascript
复制
 System.Marshall.ReleaseComObject(powershapeRoot);

然后调用Dispose()。但是,只有在显式引用了COM程序集之后才需要这样做。对于OleDB连接,调用Dispose就足够了。

https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.releasecomobject(v=vs.110).aspx

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36375012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档