将对象设置为空还将其子对象设置为空吗?

时间:2014-12-21 21:53:32

标签: oop asp-classic

假设我有一个对象,电子邮件,其中一个属性是名为EmailSkinner的对象。

EmailSkinner在class_initialize子例程中实例化,就像这样。

private sub class_initialize()
    set EmailSkinner = new MyEmailSkinner
end sub

我必须在Email的class_terminate子例程中将EmailSkinner对象显式设置为空吗?

private sub class_terminate()
    set EmailSkinner = nothing
end sub

或者当我将Email对象本身设置为空时会自动发生这种情况吗?

2 个答案:

答案 0 :(得分:1)

这是一个有趣的问题。您的假设是正确的,当父类从内存中释放时,您在父类范围内实例化的任何对象都将被释放。

然而,与VBScript中的所有对象实例化(以及扩展Classic ASP)一样,使用Class_Terminate事件显式释放对象没有任何问题。

请记住,"范围"在这里很重要。

如果在父类之外声明了EmailSkinner对象引用(无论它是否在类中实例化),引用将保留,并且需要Class_Terminate()强制释放对象引用

实施例

对象引用在类范围内声明。

Class ParentObject
  Private _ChildObject

  Private Sub Class_Initialize()
    Set _Object = new ChildObject()
  End Sub
End Class

对象引用在类范围之外声明(不推荐这种方法)。

Dim GlobalObject

Class ParentObject
  Private Sub Class_Initialize()
    Set GlobalObject = new ChildObject()
  End Sub

  'GlobalObject reference will remain so we need to
  'force it to be released.
  Private Sub Class_Terminate()
    Set GlobalObject = Nothing
  End Sub
End Class

答案 1 :(得分:1)

默认情况下,Class对象会被自动销毁,但如果在外部创建新对象,则需要从内存中释放它们。

始终建议我们在所有情况下清理内存。

我为你做了一小段代码测试(我希望这与你要解释的内容类似,因为你没有向我们展示你的代码)。

这段代码帮助我们检查一些执行和声明步骤后是否有东西留在内存中(只需取出底部的撇号来测试代码):



 Class EmailSkinner
	public color
	public size
 	Private Sub Class_Initialize
		color = "blue"
		size = 300
		End Sub
	End Class

 Class Email
	public details
	public name
	Private Sub Class_Initialize
		Set details = New EmailSkinner  '//Module Scope
		End Sub
	Private Sub Class_Terminate
		Set details = Nothing
		End Sub
	End Class

 Set email1 = New Email                 '//Global Scope
 With email1
 	.details.color = "black"
 	.details.size = 400
	End With

 ''//Take out the apostrophe to test one of the next lines
 'Response.Write email1.details.color '//ASP only
 'wscript.echo email1.details.color '//Wscript only
 
 Set email1 = Nothing