在退出子例程之前删除对象的多个实例



关于"New"关键字的用法和删除对象的多个实例,我有一些问题。

如果每次执行类似这样的代码隐藏ASP.Net语句中的子例程时都执行该子例程,那么是否会有许多employeeDetails.DataKeyNames实例?此对象是子程序的本地对象。

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

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

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

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

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

有关为什么以及何时使用IDisposable的详细解释,请参阅此问题。

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

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

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

最新更新