2013-03-24 41 views
-1

的请看看下面的代码:优化配置管理对象

Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load 
     Dim objCommand As SqlCommand 
     Dim objCon As SqlConnection 
     Dim p1 As Person 
     Try 
      p1 = New Person 
      p1.DoSomething() 
      objCommand = New SqlCommand 
      Using objCommand 
       Dim strConString As String = "Data Source=IANSCOMPUTER;Initial Catalog=Test;Integrated Security=True" 
       objCon = New SqlConnection 
       Using objCon 
        objCon.ConnectionString = strConString 
        objCon.Open() 
        objCommand.Connection = objCon 
        objCommand.CommandText = "select startdate from person " 
        Dim objDR As SqlDataReader = objCommand.ExecuteReader 
        If objDR.HasRows Then 
         objDR.Read() 
         Using objCon 
          Dim startdate As String = objDR("startdate") 
         End Using 
        End If 
       End Using 
      End Using 
     Catch ex As Exception 

      Throw 
     Finally 
      If objCon.State = ConnectionState.Open Then 
       objCon.Close() 
      End If 
      objCon = Nothing 
      objCommand = Nothing 
      p1=Nothing 'This line is still needed 
     End Try 
    End Sub 

据我所知,在finally子句中的代码是毫无意义的,因为连接和命令被包裹在using语句。

但是,如果您有像Person这样的不使用非托管资源的自定义类,会发生什么情况?当然,在这种情况下,FINALLY子句将需要确保对象(在堆上)的引用设置为空,无论是否抛出异常?

回答

1

从方法中引用对象时,不需要将变量设置为Nothing,因为一旦方法调用结束,对象将“无根”并可用于垃圾回收。当方法调用结束时,堆栈中的所有局部变量都将消失,并且它们引用的对象将没有对它们的根引用,从而使它们可用于垃圾回收。一般而言,您不需要在.NET中“空出”(通过在vb.net中将其设置为Nothing)变量,因为它不依赖引用计数来管理堆中的对象。

关于如何在.NET中分配和释放内存的概述,请看this article

+0

谢谢。 +1。如果你有一个实例变量是一个对象,会发生什么。当创建它的类被销毁时,它会被销毁吗? – w0051977 2013-03-24 13:02:41

+0

引用类型(类)的实例不会立即“销毁”。只要没有“根源”引用,它们就可用于垃圾回收。因此,对于具有实例变量的情况,一旦没有对持有实例变量的对象的引用,并且没有其他变量引用实例变量引用的对象,则它所引用的对象将可用于GC。 – PHeiberg 2013-03-24 13:07:48