2012-08-31 24 views
0

我對使用「New」關鍵字和刪除對象的多個實例有幾個問題。在退出子例程之前刪除多個實例

如果每次執行該子例程時都會執行這樣的代碼隱藏ASP.Net語句中的子例程,那麼employeeDetails.DataKeyNames會有多個實例嗎?該對象位於子例程本地。

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

如果答案是肯定的,我應該使用的代碼時完成包含此代碼的子程序刪除employeeDetails.DataKeyNames的所有副本?在這種情況下,請顯示需要執行哪些編碼才能刪除掛起的employeeDetails.DataKeyNames的所有副本。

回答

1

在這種情況下,New將用新值替換.DataKeyNames屬性中存在的任何內容。在這種情況下,您並未向該屬性添加更多值,但會看到反覆創建和銷燬字符串數組的性能損失。這是更好地檢查,看看是否值設置,然後不是用一個簡單的if語句替換:

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

話雖這麼說,你可能要檢查的其他邏輯在你的代碼,以確定爲什麼你反覆調用這個方法,看看是否有辦法減少這些調用。

+0

大家好,感謝您的詳細回覆。他們非常有幫助。我將使用描述的if語句。我還計劃在那裏粘貼一個消息框,以查看employeeDetails.DataKeyNames在每次調用子例程時是否爲Nothing。子程序的目的是在用戶選擇一個數據彙總行後顯示細節,然後在用戶單擊按鈕後調用該子例程。 –

2

您在應用程序中創建的對象引用遵循您期望的正常範圍規則。例如,如果您在方法內創建對象引用,那麼只有當方法將控制權返回給其調用方時,它纔會存在。如果在For循環內創建引用,則該引用僅在該循環的範圍內。但是,這並不意味着參考文獻指出的對象立即消失。在託管環境(如.NET)中,只有在對象不再有任何引用指向它時,垃圾收集器纔會處理內存中的對象。即使如此,GC仍會安排適當的時間在後臺處理此問題,並且只要對象的引用數量達到0,就不一定執行垃圾回收。

請參閱this article以瞭解對象的引用.NET中的垃圾回收。

當您的應用程序引用使用非託管資源創建的對象或不直接由CLR控制的資源時,此規則也有例外。一個典型的例子可能是數據庫連接或網絡套接字。在這些情況下,您可能需要在對象上實際調用Dispose以確保其資源被釋放。

請參閱this question瞭解爲什麼以及何時使用IDisposable的很好的解釋。