2012-11-16 223 views
0

將下面的語句會導致內存泄漏:VB.NET返回一個對象

Imports System.Data.SQLClient 

Public Function getConnection() As SQLConnection 
    return New SQLConnection() 
End Function 

Public Sub TestConnection() 
    Dim con As SQLConnection 
    con = getConnection 
    con.close 
    con = Nothing 
End Sub 

如何.close或.dispose被調用上的getConnection在SQLConnection?

+0

爲什麼你需要'getConnection'?爲什麼不簡單地在'TestConnection'內創建一個新的實例? – igrimpe

+0

@Tim Schmelter,我已經添加了一個Imports語句來說明問題。 – w0051977

+0

@igrimpe,getConnection()函數是必需的,因爲該函數可以返回Oracle連接。我添加了上面的簡單代碼來解釋這個問題。 – w0051977

回答

1

不會發生內存泄漏,因爲在您調用該方法後它將被垃圾回收。

但是這種方法只會造成混淆。一旦完成了連接(即使發生異常),您應該始終處理連接(隱式關閉它)。

您可以在最後Try/FinallyUsing聲明中(更容易)完成此操作。但是由於這兩種方法都需要封裝連接,所以你的方法可以使調用方法忘記它。所以這是不好的做法。

所以,簡單地做到這一點:

Public Sub TestConnection() 
    Using con = New SqlConnection("connection string here") 
     Using cmd = new SqlCommand("sql query here", con) 
      ' do something, f.e. cmd.ExecuteNonQuery() ' 
     End Using 
    End Using 
End Sub 
+0

謝謝。 TestConnection的結構如您所述。也許我應該包括它(我認爲這與問題沒有關係)。你能解釋一下:「什麼都不做,只是造成混亂」。 – w0051977

+0

@ w0051977:你的'getConnection',因爲它不會添加任何東西。 –

2

您正在返回一個引用類型,因此您對TestConnection中的同一實例進行操作,因此這裏沒有內存泄漏。 最後你有兩個null(gc將收集它們)的實例,但連接已關閉。

+0

你確定它正在返回一個引用類型嗎?使用'New'關鍵字。 – w0051977

+0

當然!這是一堂課。你用new關鍵字實例化類。 – graumanoz

+0

謝謝。對象生活在堆上。這就是我所困惑的。 – w0051977