
這兩種寫法就是一個在方法中,一個在方法外。
第一種在方法中的寫法,方法執行完了的list會被釋放掉嗎?
拋去在在方法中創建list的消耗,在性能、記憶體、堆疊上是一樣的嗎?
本來我一直用的是第一種,今天被領導說了一下,有點懵。

這一種方法執行完了以后list有沒有被釋放掉
uj5u.com熱心網友回復:
對不起,無論你那種方法都不會釋放因為你外面還有字典在用對吧,很明顯微軟不會傻到字典里是新的拷貝。所以既然字典在用那么參考計數不會為0,gc不會把你還在用的東西釋放
當然有所謂的弱參考,但是我們字典都是要占記憶體的,于其糾結釋放不說釋放,不如糾結一下你的專案會不會因為這個字典在運行N小時以后變成一個巨大的記憶體開銷
uj5u.com熱心網友回復:
你領導意思呢,其實是我們可以池化。不new,只從池里取。你現在池化數量是1不過我個人說呢,其實到不是很嚴重。list是動態記憶體是動態申請的。初始值并非很大。如果你的系統因為申請list而崩潰,我覺著這系統基本無救。就像某些XX園的人說,一個string.format讓我掛了,我依然說如果一個string.format都讓你掛了的話,那么還有什么不會讓你掛?
到了一個string.format都讓你掛的情況,也許一個 stream,一個array,一個new objec都會讓你掛
uj5u.com熱心網友回復:
正常情況下一個new list 初始數量是4. 到真不大uj5u.com熱心網友回復:
我理解是這樣的,new list開辟一塊記憶體。記憶體里村的是gameObjec的位置參考。不確定對不對。放我這個方法執行完了以后,記憶體中指頭gameobject了。其他的都已經洗掉完了。我說的是我理解的第一種。不確定對不對,向您請教下
uj5u.com熱心網友回復:
我理解是這樣的,new list開辟一塊記憶體。記憶體里存的是gameObjec的位置參考。不確定對不對。當我這個方法執行完了以后,記憶體中只是剩下了gameobject了。其他的都已經自動洗掉完了。我說的是我理解的第一種。不確定對不對,向您請教下
uj5u.com熱心網友回復:
你只說對了一半,因為物件釋放在托管語言里都是自動管理,釋放的前提是你不用了。所以他有參考計數說你對了一半那是因為如果那個字典沒用,的確如你所說,參考加一,出方法參考減一,計數為零。gc抽空釋放一下
但是能你add到字典,計數也加一,so,就算你出方法,1+1-1還是1,gc不會釋放。
uj5u.com熱心網友回復:
實際第二種方式,我們是存疑的。如果外面連續呼叫兩次(不新new這個物件的前提),我想你那個字典里存的東西都是兩個一模一樣的,邏輯有誤
uj5u.com熱心網友回復:
是的,字典里的東西是一樣的,假設邏輯沒問題的話,兩種方式會有性能差距嗎?那種好一點?還是一樣?
uj5u.com熱心網友回復:
多次在方法中new list也是有問題,假設兩種都呼叫一次呢?uj5u.com熱心網友回復:
不是杠,我就是好奇uj5u.com熱心網友回復:
都選擇用C#了,還考慮這些uj5u.com熱心網友回復:
方法外在物件回收的時候回收訪法內在函式執行完后回收
不一定是立刻回收,因為垃圾回收是自動的。
要注意,如果另一個類擁有了這個物件參考,會導致生命周期延長。
uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
你這個雖然在方法內創建的物件,但是在這個行程中,還有對這個物件的強參考,顯然是不能對其回收的。當然你還可以使用弱參考(WeakReference ),這個時候的物件是允許行程訪問,同時也允許垃圾回收器回收。
uj5u.com熱心網友回復:
強參考‘弱參考該怎區分
uj5u.com熱心網友回復:
兩種其實是一樣的。不要糾結。寫法不同而乙uj5u.com熱心網友回復:
額,你們領導真是吃的太空。。。。uj5u.com熱心網友回復:
沒辦法,沒看著我天天扳博客園粉么。因為這種風氣實在太沒整了,小程式員嘛,喜歡折騰這些玩意也就罷,影響有限,可怕的,現在喜歡把博客園那些瞎折騰的玩意當寶貝的人已經都混成小領導了。這些不看背景關系,就知道別寫try,別寫string+string,別new的博客園粉小領導,殺傷力太大了,整個neter這么搞,那就跟沒得看了
uj5u.com熱心網友回復:
是啊,對比java,人家討論用什么組件,
討論ribbitmq和kafka的使用場景,
討論微服務,
討論docker。
.net 領導在討論這。。。。。
uj5u.com熱心網友回復:
額,你們領導真是吃的太空。。。。
沒辦法,沒看著我天天扳博客園粉么。因為這種風氣實在太沒整了,小程式員嘛,喜歡折騰這些玩意也就罷,影響有限,可怕的,現在喜歡把博客園那些瞎折騰的玩意當寶貝的人已經都混成小領導了。這些不看背景關系,就知道別寫try,別寫string+string,別new的博客園粉小領導,殺傷力太大了,整個neter這么搞,那就跟沒得看了
是啊,對比java,人家討論用什么組件,
討論ribbitmq和kafka的使用場景,
討論微服務,
討論docker。
.net 領導在討論這。。。。。

雖然我很想成為大佬,這么多年過去了。我只是越來越大了,,,,,,
uj5u.com熱心網友回復:
我沒到那個高度,我想問問大佬們開發不考慮性能這塊嗎?我個人認為,小的地方都把握住了,寫出來的東西不會有問題的
uj5u.com熱心網友回復:
我沒到那個高度,我想問問大佬們開發不考慮性能這塊嗎?
我個人認為,小的地方都把握住了,寫出來的東西不會有問題的
網上有個段子:
如何快速惹怒一位醫生----------回答:我從百度看的
俺們這里其實也一樣
如何快速惹怒一個程式員--------回答:我從博客園看的
你應該學會的是專業,學會邏輯,學會分析問題,而不是看天天去看那些毫無背景關系分析,完全不靠邏輯,就靠各種嚇唬人的博文寫代碼
比如說下面這些玩意:
《什么0202年,你還這樣》
《10分鐘搞定hr》
《你離高手就差一個xxx》
---------------------------
你都說了,你只是10分鐘搞定了hr,你都說了就差一個xxx。我們前面也批了,這里動則多執行緒,動則多執行緒,動則invoke,invoke,原因在那里啊。還不是在那些博文身上
《10分鐘搞定多執行緒》
《什么0202年,你還不會invoke》
《你離血案,就差一個性能》
-----------------------------------------
只有傻子才靠百度治病,也只有傻子才靠那些博文寫代碼,搞定hr
uj5u.com熱心網友回復:
我沒到那個高度,我想問問大佬們開發不考慮性能這塊嗎?
我個人認為,小的地方都把握住了,寫出來的東西不會有問題的
網上有個段子:
如何快速惹怒一位醫生----------回答:我從百度看的
俺們這里其實也一樣
如何快速惹怒一個程式員--------回答:我從博客園看的
你應該學會的是專業,學會邏輯,學會分析問題,而不是看天天去看那些毫無背景關系分析,完全不靠邏輯,就靠各種嚇唬人的博文寫代碼
比如說下面這些玩意:
《什么0202年,你還這樣》
《10分鐘搞定hr》
《你離高手就差一個xxx》
---------------------------
你都說了,你只是10分鐘搞定了hr,你都說了就差一個xxx。我們前面也批了,這里動則多執行緒,動則多執行緒,動則invoke,invoke,原因在那里啊。還不是在那些博文身上
《10分鐘搞定多執行緒》
《什么0202年,你還不會invoke》
《你離血案,就差一個性能》
-----------------------------------------
只有傻子才靠百度治病,也只有傻子才靠那些博文寫代碼,搞定hr

不會的問題-百度-博客 無解啊
uj5u.com熱心網友回復:
可以查一下.net 垃圾回識訓制每個物件會有個屬性來記錄自己被參考的數量,垃圾回收時候回判斷物件是否此物件沒有用了,如果沒有用,就回收調.
所以,你判斷下,你這兩種情況宣告的物件,在執行完方法后,是否還有其他物件參考呢?
第一種:pool1參考了吧?那只要pool1不釋放或者不移除tmp1,tmp1就不會被垃圾回收,直到行程結束后.
第二種:沒看到參考的地方,不好判斷,但判斷原理一樣.
uj5u.com熱心網友回復:
多次在方法中new list也是有問題,假設兩種都呼叫一次呢?
很明顯第一種假設外部無參考的情況下,呼叫結束后就會被標記釋放,但是第二種要在當前物件釋放后List才會被釋放
uj5u.com熱心網友回復:
可以查一下.net 垃圾回識訓制
每個物件會有個屬性來記錄自己被參考的數量,垃圾回收時候回判斷物件是否此物件沒有用了,如果沒有用,就回收調.
所以,你判斷下,你這兩種情況宣告的物件,在執行完方法后,是否還有其他物件參考呢?
第一種:pool1參考了吧?那只要pool1不釋放或者不移除tmp1,tmp1就不會被垃圾回收,直到行程結束后.
第二種:沒看到參考的地方,不好判斷,但判斷原理一樣.
要是這樣說的話,兩種都是有應用得。
uj5u.com熱心網友回復:
學習收藏了。順便說下個人習慣: 如果這個變數(這里是字典)頻繁使用,我就會定義在VOID外,對于本CLASS內的所有VOID來說它就是PUBLIC了;如果只用一次或者偶爾用一下,我會把它定義在VOID內,那么它對于VOID屬于PRIVATE,所以我感覺該VOID執行完畢后它會釋放的。uj5u.com熱心網友回復:
第一個邏輯比較清晰,dic里面既然需要傳入一個可以,初始化一個value(那個list),那么value就應該直接new一個,并且長期存在。第二個,value(也就是那個List)居然是外部復用的,這是個參考型別啊,我都懷疑會不會導致整個字典里面的value是同一個List,嗯,不確定,我沒試過。
你可以嘗試一下,添加幾個字典之后,看看里面的內容是什么。
而且就算第二個方案能用,邏輯也不大對,既然初始化字典了,那么一個新的key,就應該new一個全新的value,為啥要從外部清除了再用。
至于記憶體回收的問題,方法執行完了,整個物件肯定會被回收的,但這個物件,指的并不是眼前的Dic或者List,而是更往外的類,也就是問題上那一串代碼所在的類,因為在此之前,你這個字典肯定是一直在用的。
猜測代碼如下:
//這是一個完整的類,要回收,就是整個回收了。
public class ClassTest{
public Dictionary<string,List<GameObject>> pool1 = new xxxx;
public void GetObject1(xxx){}
public xxx
}
void Main(){
ClassTest test = new ClassTest();
//這里也許你呼叫了GetObject的方法,往字典里面初始化了一個又一個的串列,都不會被回收的。
//一直到你Main執行結束,沒有代碼呼叫test了,整個test,包括里面的字典才會被一起回收掉。
}
不知道GameObject里面大不大,如果不大,然后那個Key不多,也就是你呼叫的的GameObject的次數不多,記憶體是不做考慮的。
如果你New了一個test,然后整個專案都在這個基礎上運行,也就是這個字典不會釋放了,那么就要考慮會不會運行一段時間字典暴漲的問題,而且這樣我比較喜歡設定成靜態變數,干脆就不要釋放字典了。。。
這個問題的基礎是,你的那個name值多不多,如果是有定數的,比如幾十幾百個游戲名字的話,影響就不大,這個叫必須的開銷,你還不能銷毀。
如果這個name值很多,而且進來初始化,然后用一段時間就不用了,那么你就需要考慮銷毀的問題了,嗯,是手動銷毀,比如從字典里面remove那些不用的key,不知道具體應用場景,就不去思考太多了。
uj5u.com熱心網友回復:
第一個邏輯比較清晰,dic里面既然需要傳入一個可以,初始化一個value(那個list),那么value就應該直接new一個,并且長期存在。
第二個,value(也就是那個List)居然是外部復用的,這是個參考型別啊,我都懷疑會不會導致整個字典里面的value是同一個List,嗯,不確定,我沒試過。
你可以嘗試一下,添加幾個字典之后,看看里面的內容是什么。
而且就算第二個方案能用,邏輯也不大對,既然初始化字典了,那么一個新的key,就應該new一個全新的value,為啥要從外部清除了再用。
至于記憶體回收的問題,方法執行完了,整個物件肯定會被回收的,但這個物件,指的并不是眼前的Dic或者List,而是更往外的類,也就是問題上那一串代碼所在的類,因為在此之前,你這個字典肯定是一直在用的。
猜測代碼如下:
//這是一個完整的類,要回收,就是整個回收了。
public class ClassTest{
public Dictionary<string,List<GameObject>> pool1 = new xxxx;
public void GetObject1(xxx){}
public xxx
}
void Main(){
ClassTest test = new ClassTest();
//這里也許你呼叫了GetObject的方法,往字典里面初始化了一個又一個的串列,都不會被回收的。
//一直到你Main執行結束,沒有代碼呼叫test了,整個test,包括里面的字典才會被一起回收掉。
}
不知道GameObject里面大不大,如果不大,然后那個Key不多,也就是你呼叫的的GameObject的次數不多,記憶體是不做考慮的。
如果你New了一個test,然后整個專案都在這個基礎上運行,也就是這個字典不會釋放了,那么就要考慮會不會運行一段時間字典暴漲的問題,而且這樣我比較喜歡設定成靜態變數,干脆就不要釋放字典了。。。
這個問題的基礎是,你的那個name值多不多,如果是有定數的,比如幾十幾百個游戲名字的話,影響就不大,這個叫必須的開銷,你還不能銷毀。
如果這個name值很多,而且進來初始化,然后用一段時間就不用了,那么你就需要考慮銷毀的問題了,嗯,是手動銷毀,比如從字典里面remove那些不用的key,不知道具體應用場景,就不去思考太多了。
實際上它只會存在一會,比如在某個玩家點擊了某個按鈕后,出現,退出這個功能是他是會銷毀得。字典remove是,里邊得物件也要手動得Destroy掉
uj5u.com熱心網友回復:
結把,程式員應該關注邏輯。而不要整天把心思花在這些低級的技術/技巧爭論上,爭贏了爭不贏有意義么,我們面對不加班編程(邏輯不出錯,系統穩定,擴展強),不面對簡歷編程(滿嘴跑名詞,忽悠死HR在說)打架最后靠的都是,力量,速度,反應能力,神經反射速度,肌肉記憶能力。而不是靠著什么啊,人家黑虎掏心,看看你錯把,你應該用五連鞭,不應該用白鶴亮翅
uj5u.com熱心網友回復:
第一種是方法變數,方法執行完,list里就沒有值了,但是不會釋放,第二種是類變數,執行完方法,list里的值不會丟。但是也不會自動釋放uj5u.com熱心網友回復:
一個是全域變數,一個是區域變數 這不就區別出來了嗎,如果這個方法不被其他類呼叫那沒事,如果是被其他類呼叫的那不就有事了嗎,每次來調這個類中任意一個方法都會new list集合 因為是全域, 如果寫在方法里面,就只會在呼叫這個方法的時候才會new 這個lisT集合。轉載請註明出處,本文鏈接:https://www.uj5u.com/net/9885.html
標籤:C#
上一篇:C#如何控制用戶請求數?
