C 值型別為什麼不能為空null

2022-07-10 14:09:13 字數 1245 閱讀 5040

參考部落格:

shyleoking

首先我們知道值型別儲存在棧(stack)中,而引用型別儲存在堆(heap)中,棧的工作方式是先進後出,會保證先分配記憶體的變數後釋放。

這樣就保證了棧中先進後出的規則不與變數的生命週期起衝突。

在c#中,對變數的宣告要求是先定義後使用,變數的生命週期是從其定義開始直到程式的控制離開該變數所在的大括號

static void main(string args)

//j的生命週期結束了

//m的生命週期結束了

}//i的生命週期結束了

//k的生命週期結束了

}

下面的圖描述了這些變數的生命週期和堆疊的儲存

上述的**改為如下形式:

static void main(string args)

//i的生命週期結束了

//k的生命週期結束了

}

現在我們看下**到第8行時的棧:

這個時候k在棧底,如果我們想釋放k,就要先釋放m和i。

所以這樣操作就破壞了棧的先進後出的規則,所以會出錯,編輯就會報錯。

上述的**改為如下形式:

static void main(string args)

//j的生命週期結束了

//m的生命週期結束了

}//i的生命週期結束了

//k的生命週期結束了

}

棧中的處理大致如圖:

此時變數k還是分配在棧中,但實際存放list例項的區域是在堆中。對list的例項使用,是通過在棧中的變數k來間接的指向的。所以就把物件引用null和生命週期兩個概念可以分離出來。

所以就算我們把k = null,也只是讓變數k不再指向堆中的有效位址了,但其生命週期並沒有發生變化。

現在我們明白了,因為值型別變數直接在棧中儲存了資料,因此在生命週期結束前資料不能被任何形式的銷毀,而引用型別變數在堆中儲存資料,所以賦值null其實是將對應在堆中的資料銷毀而不是結束變數的生命週期。

值不能為 null。 引數名 source

今天除錯程式總是報乙個異常 異常詳細資訊 system.argumentnullexception 值不能為 null。引數名 source 通過斷點發現是這段 錯誤,發生這個異常通常是方法中某個引數為空了,而我的方法中沒有乙個名為source的引數啊,後來發現是 processors 為 null...

為什麼您不能為Google工作

當雅虎更改遠端工作政策時 網路圍繞遠端員工的價值展開了激烈的辯論,有關google取消gpa,考試成績和費公尺問題的答案的最新訊息使許多科技公司重新考慮了他們的招聘程式。一天之內,其中一家公司的文章沒有出現在大多數主要新聞 的首頁上。手工業開始蓬勃發展,作家和演講者為有抱負的工程師提供指南,以幫助他...

為什麼static函式不能為virtual

首先什麼是static靜態成員函式?靜態成員函式不屬於類中的任何乙個物件和例項,屬於類共有的乙個函式。也就是說,它不能用this指標來訪問,因為this指標指向的是每乙個物件和例項。對於virtual虛函式,它的呼叫恰恰使用this指標。在有虛函式的類例項中,this指標呼叫vptr指標,指向的是v...