0

关于“New”关键字的使用和删除对象的多个实例,我有几个问题。

如果像这样的代码隐藏 ASP.Net 语句中的子例程在每次执行子例程时都执行,会不会有很多employeeDetails.DataKeyNames 的实例?该对象是子例程的本地对象。

employeeDetails.DataKeyNames = New String() {"EmployeeID"} 

如果答案是肯定的,当包含此代码的子例程完成时,我是否应该使用代码删除employeeDetails.DataKeyNames 的所有副本?在这种情况下,请说明删除所有的employeeDetails.DataKeyNames 副本需要什么编码。

4

2 回答 2

2

您在应用程序中创建的对象引用遵循您所期望的正常范围规则。例如,如果您在方法内创建一个对象引用,那么它只会存在,直到该方法将控制权返回给它的调用者。如果您在循环内创建引用For,则该引用仅在该循环的范围内。但是,这并不意味着引用指向的对象会立即消失。在 .NET 等托管环境中,垃圾收集器仅在对象不再有任何指向它的引用后才处理销毁内存中的对象。即使这样,GC 也会在后台安排适当的时间来处理这个问题,并且不一定会在对象的引用数达到 0 时立即执行垃圾回收。

有关 .NET 中垃圾收集概念的介绍,请参阅本文

当您的应用程序引用使用非托管资源或不由 CLR 直接控制的资源创建的对象时,此规则存在例外情况。一个典型的例子可能是数据库连接或网络套接字。在这些情况下,您可能需要实际调用Dispose对象以确保释放其资源。

有关为什么以及何时使用IDisposable.

于 2012-08-31T13:56:41.523 回答
1

在这种情况下,New 将用新值替换 .DataKeyNames 属性中存在的任何内容。在这种情况下,您不会向该属性添加更多值,但会看到重复创建和销毁字符串数组的性能损失。最好检查该值是否已设置,然后不要用简单的 if 子句替换它:

If employeeDetails.DataKeyNames Is Nothing Then
  employeeDetails.DataKeyNames = New String() {"EmployeeID"}
End If

话虽如此,您可能需要检查代码中的其他逻辑以确定您重复调用此方法的原因,并查看是否有减少这些调用的方法。

于 2012-08-31T13:46:49.270 回答