2014-03-12 41 views
1

調用一個方法來重新初始化一個類的屬性vs創建一個新的對象有什麼好處嗎?我正在研究一個能夠做到這一點的應用程序,並且正在考慮重構它來消除這些調用。構造函數與刷新/設置屬性

最初的開發人員對VB6更加熟悉,因此可能是他們帶來的習慣。

有什麼我錯過了,這將是一個好主意?

編輯:類是輕量級的,基本上數據類有十幾個原始屬性和刷新方法。

+0

我不會消除呼叫。查看來自Bradley的回答+1 – Paparazzi

回答

2

在某些高性能的情況下有優勢。

.NET依靠垃圾收集器來清理變量,因爲它們超出了範圍,因此不斷創建實例並將它們扔掉將需要更頻繁的垃圾收集,這會消耗CPU並在某些情況下可以暫停您的線程。

如果您的對象需要大量資源來實例化,那麼您將從重用對象而不是創建新對象中受益。實際上有一種叫做「Pooling」的模式,它分配一個對象池並從該池中繪製實例,根據需要初始化它們,並在完成時將它們返回到池中。這與ThreadPool和SSQL連接池用於管理「繁重」資源的模式相同。在一些通常會創建許多對象並快速超出範圍的情況下,它也可以顯着幫助小型對象的性能。

+0

我認爲CLR比這更聰明一點,而且本地對象很容易被GC'd?但是我找不到我正在考慮的文章......無論如何,我認爲這不是一個可能的原因,爲什麼這種模式會被使用,因爲在一天中最多會有幾千個額外的引用(即大量的時間讓GC擺脫它們) – jmoreno

+0

作爲值類型的局部變量很容易清理,因爲它們是基於堆棧的。當一個堆棧框架被彈出時,它上面的所有值都被清除。引用類型由垃圾收集器管理,它們的內存只在運行時才被回收。你說得對,線程和sql連接由於垃圾收集而沒有被合併,它們是合併的,因爲它們分配的重對象需要大量工作來實例化。這一切都歸結於你的訪問模式和實例化成本,以確定合併是否會受益您。 –

+0

沒錯,但是我認爲有一個靜態分析可以讓局部變量(引用類型)快速簡單地清理出vb或c#(類似於可以用託管C++完成的工作,在那裏你可以擁有語義在堆棧上創建了一個ref類型)。 – jmoreno

相關問題