VBA中类的解读及应用第三十六讲 类对象的销毁过程----“二师兄”的成长历程之八
《VBA中类的解读及应用》教程【10165646】是我推出的第五套教程目前已经是第一版修订了。这套教程定位于最高级是学完初级中级后的教程。类是非常抽象的更具研究的价值。随着我们学习、应用VBA的深入有必要理解这些抽象的理论知识。对象类过程方法属性事件接口接口如何实现等等。掌握了这些理论不仅对于VBA这种寄生语言的实质有所深入的理解也对自然界的很多事物将同样有所感悟。目前这套教程程序文件已经通过32位64位两种office系统测试。这套教程共两册八十四讲今后一段时间会给大家陆续推出修订后的教程内容。今日的内容是VBA中类的解读及应用第三十六讲 类对象的销毁过程----“二师兄”的成长历程之八【分享成果随喜正能量】会因为有情绪而烦闷也因为没控制情绪而懊悔。莫道幽人一事无闲中尽有静工夫。情绪就像水宜疏不宜堵。学会控制情绪不能把情绪看得过重也不能一味遏制情绪的产生。倾听所有声音尊重所有声音但只成为自己不被情绪支配才是高级自由第三十六讲 类对象的销毁过程----“二师兄”的成长历程之八大家好我们继续关注二师兄的成才历程。在上一讲中我们谈到类与生俱来的两个事件Class_Initialize实例化事件和Class_Terminate销毁事件。这两个事件刚好对应着类对象的生与死。在类对象的销毁事件中触发的原因是类对象执行了END SUB这个时候将触发类的销毁过程这种触发我们称之为作用域的自动触发也就是说当这个变量在离开作用域时候会自动触发这个变量的销毁事件。这种方法在面向对象编程中我们一般不采用那么会采用什么样的方式触发类对象的销毁事件呢这就是Set objpigsy Nothing这种写法在我的第二套教程《VBA数据库解决方案》和第三套教程《数组和字典解决方案》中大家是经常看到的对于某个记录集连接或者某个字典在应用完成后为了释放内存会使用这样写法这样写法也是非常好理解的让某个变量等于Nothing就是释放了这个变量占用的内存。大多数的情况下在类对象编程中也建议使用这样的写法。1 类对象的强制销毁那么我们的代码将写成Sub mynz_36()Dim objpigsy As pigsySet objpigsy New pigsyobjpigsy.Name 猪悟能objpigsy.Gender Maleobjpigsy.SpeakSet objpigsy NothingEnd Sub代码的截图代码解析在上述代码中执行Class_Terminate销毁事件是在代码执行到Set objpigsy Nothing的时候就去执行了而不是在执行到end sub作用域消失的时候再去执行销毁事件对的提前了。这样的写法是我们建议的也是和数据库、字典的写法一致的。其他的代码解析略。2 类对象变量与其他一般变量的不同我们在这讲中谈到类对象变量的销毁过程那么类对象和其他的对象变量有什么不同呢这里给大家一个常理类对象变量与一般的变量最大的不同在于可以有多个类对象变量指向同一个内存空间一个类对象会一直占用内存直到最后一个指向它的对象变量被set Nothing。在讲了类对象销毁事件后我们来验证一下这个神奇的事情Sub mynz_36_1()Dim objpigsy1 As pigsyDim objpigsy2 As pigsySet objpigsy1 New pigsySet objpigsy2 objpigsy1Debug.Print objpigsy1 Is objpigsy2Set objpigsy1 NothingSet objpigsy2 NothingEnd Sub代码截图代码解析上述的代码中我们要判断一下objpigsy1 Is objpigsy2 大师兄会分身之术二师兄也会的。好了我们看看但代码的执行过程要注意使用F8来看每个结果图1图2图3图4图5大家由上述过程可以看出:直到最后的一个变量完成了使命二师兄才去了西方的极乐。今日内容回向1 类对象的销毁事件发生的两种情况是什么2 类对象变量和普通的对象变量有什么不同本讲内容参考程序文件VBA-CLASS36.xlsm我20多年的VBA实践经验全部浓缩在下面的各个教程中