1、方式1通過out 引數對外傳遞list 串列
public bool getRedIR(string file, out List<double> red, out List<double> ir)
{
FileStream fs = new FileStream(file, FileMode.Open);
StreamReader sr = new StreamReader(fs);
string str = "";
red = new List<double>();
ir = new List<double>();
do
{
str = sr.ReadLine();
string[] strArray = str.Split(' ').Where(x => !string.IsNullOrEmpty(x) ).ToArray();
double vRed = double.Parse(strArray[2]);
double vIr = double.Parse(strArray[3]);
red.Add(vRed);
ir.Add(vIr);
}
while (str != null);
return true;
}
double vRed = double.Parse(strArray[2]);
double vIr = double.Parse(strArray[3]);
這種方式,每次呼叫的時候,都要new 一下, 會不會導致記憶體泄漏? 如果洗掉list是由c#自動完成的, 會不會外部呼叫函式在獲取
red 和 ir 后,串列內部資料還沒有處理完,就被C#自動釋放了? 會不會有這種情況的產生。
方式2: 通過ref 對外傳參
但是外部new 兩個全域的List, 這種應該不會有什么問題
uj5u.com熱心網友回復:
C#的記憶體釋放沒那么快的,不用擔心資料沒處理完就被釋放了。https://www.cnblogs.com/worfdream/articles/2345053.html
uj5u.com熱心網友回復:
資料存在參考,就不會被回收。uj5u.com熱心網友回復:
會不會導致記憶體泄漏? __gc會回收的,你只要不弄死回圈出來 結束就回收了red 和 ir 后,串列內部資料還沒有處理完,就被C#自動釋放了? 只要你不手動回收 就不會,自動回收要等你方法執行完
但是外部new 兩個全域的List, 這種應該不會有什么問題,那你這是全域變數么? 使用全域變數在使用完之后清空即可,都沒得啥問題的
uj5u.com熱心網友回復:
1、自動回收等到方法執行完,但是方法執行完很長的一段時間,red 和ir 兩個傳出去的list 都要被外部使用,
C# 會自動判斷這兩個list使用完畢來釋放, 還是僅僅是在getRedIR 方法執行完畢就立馬釋放
2、全域的list,比如在建構式中new 出來的list, C# 不會自動釋放, 需要開發者手動釋放, 是這個意思吧?
uj5u.com熱心網友回復:
只要存在參考,就不會被回收,是托管物件的一個簡單又實用管理原則。只要這個物件你還用得到,是不會被回收的,完全不需要擔心提前回收的問題,反而有時候要擔心回收得不夠快,所以在 .net 里面還需要非托管物件。out 也好,ref 也好,return 也好,都是一種參考,參考鏈已經到函式體之外,函式的運行結束,對這些物件已經完全沒有影響。
uj5u.com熱心網友回復:
哦 我大概明白了。 這里不像c c++ ,要做好記憶體回收, 系統自動 幫忙弄好了。
這里還有另外一個問題需要請假下:
就是你上面的說的回收的不夠快的問題, 比如有一個串口決議函式, 里面有new list 的動作, 如果頻繁的接受到串口幀, 也就會頻繁的呼叫new list, 假如系統回收的不夠快, 會造成哪些影響, 比如記憶體泄漏、決議卡頓
uj5u.com熱心網友回復:
記憶體溢位,直接夏特當了uj5u.com熱心網友回復:
C# 的 List<T> 是托管物件,托管物件是沒有辦法手動釋放資源的。不知道你的 List<T> 長度有多少,一般來說是占不了多少記憶體的。你要相信托管物件 .net 都會及時地回收資源的。沒有辦法及時回收的物件,.net 都設計成為了非托管,比如影像、流相關的,其實這是一種無奈的做法。因為沒有辦法及時地回收,所以把回收的權限交給了程式員,這些物件都會有一個 Dispose 方法,讓程式員在適合的時候主動呼叫回收。
托管語言里面又包括非托管物件,其實對編程造成了不少的麻煩,尤其是一開始就學習托管語言的程式員,不過這個是托管語言的技術天花板,不知道以后能不能解決這個問題,把所有物件都做成托管的。
如果你想了解垃圾回識訓回收資源的時機,你可以寫一個帶解構式的類,垃圾回識訓回收物件的時候,會呼叫這個解構式,如果這個解構式里面做了提示或者日志,這樣你就知道垃圾回識訓什么時候釋放物件的資源了。
uj5u.com熱心網友回復:
雖然參考物件的物件被釋放之后“不夠快”呼叫GC,但是也是幾秒鐘內就至少呼叫一次,所以你不用擔心。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/38111.html
標籤:C#
