vb.net下如何销毁类的实例

  原提问地址:http://hi.csdn.net/link.php?url=http://topic.csdn.net%2Fu%2F20091116%2F22%2F67d13f8b-3f05-4455-8042-721f5198b1b5.html

 

    vb.net下如何销毁类的实例,这个问题其实已经困扰了我至少两年之久,一直没有时间来做个实验,于是在简单做了个实验后,发帖于CSDN。(请原谅我的命名规则,切勿模仿!)

      实验的过程非常简单,创建一个名为class1的类,类中只有一个字符串变量及一个timer,用于控制输出的内容及间隔,在form1的load 过程中,创建一个class1的实例,在 button1 的click事件中创建class1的另一个实例,并将第一个实例销毁;

      代码如下:

 

 

      先后创建的两个实例的变量,均是过程级的,按十年前的学习教程讲到的“生存周期”,我理解的过程级变量在过程结束后自动销毁,但是,当form1的load 过程结束后,我仍然能看到"xxxx/xx/xx xx:xx:xx-->第1个类的实例"以一秒的间隔被DEBUG出来,也就是说,过程是结束了,(也许变量已经被销毁了)但是该实例并没有被销毁,由此,我可以得到变量与实例并不是一回事,通俗的讲,此处的变量,只是这个实例的一个名字或者说别名罢了(至少在过程中,可以通过这个名字找到这个实例)。

      我的目的是在第二个实例创建的时候,销毁第一个实例,但是由于第一个实例的变量是过程级的,在button1 的click事件中我无法索引到它,因此无法将其销毁,所以,在创建第一个实例的时候,我将它加入一个集合中,button1 的click事件中我有一行“******”的代码,其实我是尝试了如下几种方法:

方法一:

 

方法二:

方法三:

 

       甚至将上述三种方法组合使用,我仍然能看到讨厌的"xxxx/xx/xx xx:xx:xx-->第1个类的实例"以一秒的间隔被DEBUG出来,尽管bb这个集合中已经没有该对象了,尽管t已经被置为nothing了!

      在方法一的应用时,我根据CSDN坛里兄弟及几个朋友的建议,将class1继续了IDisposable接口,代码如下:

 

 

     只有我在Dispose方法中,将t也Dispose的时候,讨厌的的提示才没有,但是,又如我在t.Dispose后边的注释写的一样,新的问题出现了时钟对象是销毁了,但是这个类的实例也同时销毁了吗?
     为了验证类的实例是否真的被销毁了,我将class1进行了一个小的改造,在其初始化的时候,开一个100MB大小的 byte数组,变动后的代码如下:

       如我想像,当窗体加载时,我发现该应用程序占去了100多MB的内存空间,当button1被按下后,第1个类实例的文字确实没有了,但是,同时内存空间双多了100MB(因为实例了第二个),也就是说,时钟对象是销毁了,但是这个类的实例却没有被销毁!

       考虑到有朋友认为,垃圾回收是系统自动完成的,且,当该类没有任何实例的时候,系统会自动回收,那么,就可以理解成,当类仍然存在实例的时候,其它实例的资源系统是不回收的,这显然不满足实际的开发需要。我的实际工作是要管理上万个tcp的联接,每个终端对象都会频繁的联接、断开,周而复始,一个对象断开后,我就要释放相应的资源,否则,经过N多次的断开联接后,可能只保持一个联接里,我的系统资源已经没有了(因为类仍然有实例,资源没有被自动回收)。

       于是,在创建第二个实例的时候,我强制要求系统回收资源,button1 的click事件变更成:

     

      重新实验,当button1被按下后,第1个类实例的文字没有了,第2个类的实例开始按1秒的间隔被Debug出来,内存的开销只增加了几K,实例1被销毁了。

 

     总结:

           有朋友说,集合中记录的只是个引用,不能记录在集合中,对象的存储和调用本身就是按址引用的,所以,这个不存在问题;

           我测试开了100M的byte数组有些bt,但足以说明问题,我们不能因为现在内存及CPU足够大,足够快而忽视对资源的掌握;

           .Net 的垃圾回收并不是万能的;

           实验很重要。

     

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 好的,下面是一个 VB.NET 操作 XML 文件的示例: 1. 创建 XML 文件: ``` Dim xmlDoc As New XmlDocument() Dim xmlDeclaration As XmlDeclaration = xmlDoc.CreateXmlDeclaration("1.0", "UTF-8", Nothing) xmlDoc.AppendChild(xmlDeclaration) Dim rootNode As XmlElement = xmlDoc.CreateElement("Root") xmlDoc.AppendChild(rootNode) xmlDoc.Save("test.xml") ``` 2. 读取 XML 文件: ``` Dim xmlDoc As New XmlDocument() xmlDoc.Load("test.xml") Dim rootNode As XmlElement = xmlDoc.DocumentElement For Each childNode As XmlNode In rootNode.ChildNodes Console.WriteLine(childNode.Name & ": " & childNode.InnerText) Next ``` 3. 修改 XML 文件: ``` Dim xmlDoc As New XmlDocument() xmlDoc.Load("test.xml") Dim rootNode As XmlElement = xmlDoc.DocumentElement For Each childNode As XmlNode In rootNode.ChildNodes If childNode.Name = "NodeName" Then childNode.InnerText = "New Value" End If Next xmlDoc.Save("test.xml") ``` 希望这些代码对你有所帮助。 ### 回答2: VB.net中操作XML文件常用的是XmlDocument和XmlNode。下面是一个使用VB.net操作XML文件的示例。 ```vb.net Imports System.Xml Public Class XMLExample Public Sub ReadXMLFile(filePath As String) ' 创建一个XmlDocument对象 Dim xmlDoc As New XmlDocument() ' 加载XML文件 xmlDoc.Load(filePath) ' 获取根节点 Dim rootNode As XmlNode = xmlDoc.DocumentElement ' 遍历根节点下的所有子节点 For Each childNode As XmlNode In rootNode.ChildNodes ' 输出子节点的名称和内容 Console.WriteLine("节点名称: " & childNode.Name) Console.WriteLine("节点内容: " & childNode.InnerText) Next End Sub Public Sub WriteXMLFile(filePath As String) ' 创建一个XmlDocument对象 Dim xmlDoc As New XmlDocument() ' 创建根节点 Dim rootNode As XmlNode = xmlDoc.CreateElement("Books") ' 将根节点添加到XmlDocument对象中 xmlDoc.AppendChild(rootNode) ' 创建子节点 Dim bookNode As XmlNode = xmlDoc.CreateElement("Book") ' 创建子节点的属性 Dim attrib As XmlAttribute = xmlDoc.CreateAttribute("ISBN") attrib.Value = "978-7-121-32712-3" ' 将属性添加到子节点中 bookNode.Attributes.Append(attrib) ' 将子节点添加到根节点中 rootNode.AppendChild(bookNode) ' 创建子节点的子节点 Dim titleNode As XmlNode = xmlDoc.CreateElement("Title") titleNode.InnerText = "VB.net XML文件操作实例" ' 将子节点的子节点添加到子节点中 bookNode.AppendChild(titleNode) ' 保存XML文件 xmlDoc.Save(filePath) End Sub End Class ' 使用示例 Private Sub Main() Dim example As New XMLExample() Dim filePath As String = "example.xml" ' 写入XML文件 example.WriteXMLFile(filePath) ' 读取XML文件 example.ReadXMLFile(filePath) End Sub ``` 上述示例中,提供了读取XML文件和写入XML文件的两个方法。创建了一个XmlDocument对象来加载和操作XML文件。通过XmlDocument对象的方法和属性,可以方便地读取和修改XML文件的内容。读取XML文件时,通过遍历节点的方式获取节点的名称和内容。写入XML文件时,通过创建节点和属性的方式构建XML节点树,并将节点添加到XmlDocument对象中。最后使用XmlDocument对象的Save方法将XML文件保存到磁盘中。 ### 回答3: 在VB.net中,我们可以使用System.Xml命名空间下的来进行XML文件的操作。下面是一个XML文件操作的实例: 首先,我们需要在程序中引入System.Xml的命名空间,以便使用相应的。可以在代码文件的顶部添加以下代码: ```vb Imports System.Xml ``` 接下来,我们需要创建一个XmlDocument对象来加载XML文件。假设我们有一个名为"example.xml"的XML文件,它的内容如下: ```xml <?xml version="1.0" encoding="UTF-8"?> <products> <product> <id>1</id> <name>Product1</name> <price>10.0</price> </product> <product> <id>2</id> <name>Product2</name> <price>20.0</price> </product> </products> ``` 我们可以使用以下代码来加载XML文件: ```vb Dim xmlDoc As New XmlDocument() xmlDoc.Load("example.xml") ``` 接下来,我们可以使用SelectNodes或SelectSingleNode方法来选择XML节点。例如,要选择所有的product节点,可以使用以下代码: ```vb Dim productNodes As XmlNodeList = xmlDoc.SelectNodes("/products/product") ``` 如果要选择某个具体的节点,可以使用SelectSingleNode方法,并传入XPath表达式。例如,要选择第一个product节点的name子节点,可以使用以下代码: ```vb Dim nameNode As XmlNode = xmlDoc.SelectSingleNode("/products/product[1]/name") ``` 要访问节点的内容,可以使用InnerText属性或Value属性。例如,要获取第一个product节点的name子节点的文本内容,可以使用以下代码: ```vb Dim name As String = nameNode.InnerText ``` 如果要修改节点的内容,可以直接修改节点的InnerText属性。例如,要将第一个product节点的name子节点的文本内容修改为"New Product",可以使用以下代码: ```vb nameNode.InnerText = "New Product" ``` 最后,我们需要保存修改后的XML文件。可以使用Save方法来保存XML文件。例如,要保存修改后的XML文件为"example_modified.xml",可以使用以下代码: ```vb xmlDoc.Save("example_modified.xml") ``` 以上就是一个简单的VB.net中操作XML文件的示例。通过使用System.Xml命名空间下的,我们可以加载、选择、修改和保存XML文件中的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值