我对“New”关键字的使用以及删除对象的多个实例有几个问题。
如果每次执行子例程时都执行像这样的代码隐藏ASP.Net语句中的子例程,那么employeeDetails.DataKeyNames会有多个实例吗?该对象是子例程的本地对象。
employeeDetails.DataKeyNames = New String() {"EmployeeID"}
如果答案是肯定的,那么当包含此代码的子程序完成后,我是否应该使用代码删除employeeDetails.DataKeyNames的所有副本?在这种情况下,请显示删除employeeDetails.DataKeyNames的所有副本所需的编码。
答案 0 :(得分:2)
您在应用程序中创建的对象引用遵循您期望的常规范围规则。例如,如果在方法内创建对象引用,则只有在方法将控制权返回给其调用方时才会存在。如果在For
循环内创建引用,则引用仅在该循环的范围内。但是,这并不意味着引用指向的对象立即消失。在诸如.NET之类的托管环境中,只有在对象不再具有指向它的任何引用之后,垃圾收集器才会处理销毁内存中的对象。即使这样,GC也会安排适当的时间在后台处理,并且一旦对象的引用数达到0,就不一定执行垃圾收集。
有关.NET中垃圾收集概念的介绍,请参阅this article。
当您的应用程序引用使用非托管资源创建的对象或不由CLR直接控制的资源时,此规则有例外。典型的例子可能是数据库连接或网络套接字。在这些情况下,您可能需要在对象上实际调用Dispose
以确保释放其资源。
有关使用IDisposable
的原因和时间的详细解释,请参阅this question。
答案 1 :(得分:1)
在这种情况下,New将使用新值替换.DataKeyNames属性中存在的任何内容。在这种情况下,您不会向该属性添加更多值,但会看到重复创建和销毁字符串数组的性能损失。最好检查一下是否设置了值,然后用一个简单的if子句替换它:
If employeeDetails.DataKeyNames Is Nothing Then
employeeDetails.DataKeyNames = New String() {"EmployeeID"}
End If
话虽如此,您可能需要检查代码中的其他逻辑,以确定重复调用此方法的原因,并查看是否有减少这些调用的方法。