物件Object的New,Dispose與Connection的Open,Close概念分享
經常遇到一些人寫成是因為沒有New造成程式錯誤,另外對於Connection的New,Dispose,Open,Close概念也不是很清楚。小喵本篇就小喵自己的認知來說明這些東西的意義
這篇文章源自於有位網友對於Using的疑問(http://www.blueshop.com.tw/board/show.asp?subcde=BRD20080703145519KXS&fumcde=FUM20041006161839LRJ)
小喵就小喵的認知來說明,不見得正確,如有錯誤請大家指正,感恩
什麼是New
我們經常可以看到有人使用一個物件的時候會寫
Dim oEmp as ObjEmployee
oEmp = New ObjEmployee
而且少了New就不能執行,那麼什麼是New呢
New是產生執行個體,不過相信很多人又要問,什麼是【產生執行個體】 (能不能講明白一點啊!! )
這要提到電腦的程式運作過程。程式在電腦上跑,會把程式的區段,在記憶體裡面挖一塊空間,然後把程式碼載入那塊空間
接著程式在運作的時候,就是記憶體與CPU之間溝通、運算、記錄等動作,而把【挖塊記憶體,把程式載到那塊空間】這個過程就是【產生執行個體】。
因此沒有New的話會怎樣,程式區塊根本沒有載入到記憶體中,因此也無法運作執行
講的擬人化一點
Dim oEmp as ObjEmployee '宣告oEmp是ObjEmployee這種物件類別(此時有魂無體)
oEmp = New ObjEmployee '產生執行個體(此時投胎轉世,靈魂變成實體,可以開始工作)
什麼是 Dispose
當一個物件已經使用完後,未來不會再使用,此時這個物件已經完成他這一生(New完之後到現在)的任務。因此他可以塵歸塵、土歸土...一切還諸天地...此時就進行Dispose
然而實際上,在記憶體中,當物件Dispose的時候,並沒有把該段記憶體清空,只是標註,這段空間不再使用,直到GC啟動把他清空才算真正的清空。
因此如果用完後,不進行 Dispose ...那麼就會等到該位置很久沒動作了(就像有個人躺在地上,已經超過一定時間(一個月??)沒動作,也沒呼吸),才會被其他的程式拿來用。
以上說明的是New(生)與 Dispose (死)的關係
什麼是Open
當你有了實體後,代表可以開始運作
但不是真的已經運作了
以Connecion來說
Using Conn As New Connetion(ConnStr)
'Conn.Open
Dim Dr as SqlDataReader
Using Cmmd as New SqlCommand("Select...",Conn)
Dr = Cmmd.ExecuteReader
End Using
End Using
上面這段程式會出錯,他告訴你...Connection沒有Open,也就例如您建立了一個橋,但是這座橋卻沒有通車,因此也沒辦法用。因此使用DataReader或者Cmmd.ExecuteNoneQuery的時候,都需要告訴他已經通車了...他才會正常運作。
而如果使用DataAdapter的話這個傢伙比較厲害... 他會看有沒有通車,有通車他就用;沒通車的話,他會自己把這通道打開,然後去使用。
最後說什麼是Close...
Close是關閉通道,通道關了是可以再開的唷。
然後跟上面的 Dispose 再比對一下:
Close只是把通道關閉
Dispose 卻是通知作業系統...我已經完成任務,這段記憶體你可以拿去再用...然後壽終正寢
知道不一樣在哪了嗎??
以下是簽名:
- 歡迎轉貼本站的文章,不過請在貼文主旨上加上【轉貼】,並在文章中附上本篇的超連結與站名【topcat姍舞之間的極度凝聚】,感恩大家的配合。
- 小喵大部分的文章會以小喵熟悉的語言VB.NET撰寫,如果您需要C#的Code,也許您可以試著用線上的工具進行轉換,這裡提供幾個參考
Microsoft MVP Visual Studio and Development Technologies (2005~2019/6) | topcat Blog:http://www.dotblogs.com.tw/topcat |