C 值型別和引用型別(未賦值的區域性變數)

2021-09-11 02:45:02 字數 1684 閱讀 7679

【引言】

這部分內容還是很重要的,那麼是什麼讓我對值和引用型別著迷呢?

我們先來看一下例子:

這個是我們當時在討論設計模式的時候看到的,你們可以想想,為什麼會宣告null? 直接宣告 expression expression;不行嗎?

如果直接宣告  expression expression;會出現什麼情況?

就會出現未賦值的區域性變數expression這個錯誤。 那麼到底是怎麼回事呢?那麼我們先來了解一下值型別和引用型別吧。

【正文】

舉個例子:

(1)值型別:

結果:(2)引用型別

結果:是不是感覺很驚訝? 其實他們兩個的型別不一樣,導致結果也是不一樣的。int屬於值型別,陣列屬於引用型別。

左邊屬於值型別,右邊屬於引用型別。

值型別可以直接copy,引用型別在棧裡面存的是位址,在堆裡面存的值。

這就是上邊例子的原因。

(3)那麼值型別和引用型別有什麼不同?

1)值的型別存在棧上,引用型別 棧存的是位址, 值存在堆上。

2)在c#中,值型別的變數直接儲存陣列,而引用型別的變數是對資料的引用。

3)引用型別和值型別相同的是,結構體可以實現介面。

4)引用型別可以包含null,值型別不能(可以將null賦值給值型別,如 int? a = mull;);

5)值型別的變數賦值是直接copy,而引用型別時賦值對物件的引用。

6)值型別不支援多型,引用型別支援多型。

(4)那麼都有哪些是值型別,哪些是引用型別?

(5)c#中宣告引用型別變數=null,在記憶體中意味著什麼?

比如 a a = new a(); 就是在堆裡面搞了一塊符合a的空間嘛

如果a a = null ; 堆裡面會產生什麼呢,還是說只是棧裡面多了個 a?

解答:

【終極】

(5)結果:

expression expression=null ;

express= new scale();

expression 是乙個引用型別, expression為引用變數, 它的目的是用來存在expression例項的引用,一般地 expression 在棧中。而a 例項的物件在堆中。

expression expression= null;

僅僅是將引用變數初始化為null,並沒有例項化expreesion,所以堆中沒有a的例項。

C 值型別賦值與引用型別的賦值

在c 中,資料型別大致可以分為兩類,一類是值型別,一類是引用型別。初學者往往會被型別之間的相互賦值搞的很迷惑,尤其是引用型別變數的相互賦值。現在舉2個例子,來一一說明。值型別變數的賦值 值型別變數中儲存的是實際資料,在賦值的時候只是把資料複製乙份,然後賦給另乙個變數。例子1 int var1 2 i...

C 值型別賦值與引用型別的賦值

c 程式設計中,大家會經常使用到不同的資料型別,那麼 程式語言到底有什麼型別呢?具體如下 1 值型別 各種值型別總是含有相應該型別的乙個值。c 迫使你初始化變數才能使用它們進行計算 變數沒有初始化不會出問題,因為當你企圖使用它們時,編譯器會告訴你。每當把乙個值賦給乙個值型別時,該值實際上被拷貝了。相...

C 值型別和引用型別

c 資料型別 值型別,引用型別 概念 值型別直接儲存其值,引用型別儲存對值的引用 這兩種型別儲存在記憶體的不同地方 值型別儲存在堆疊中,引用型別儲存在託管堆上。乙個引用型別的例子,如圖 上圖中,只有乙個user物件,u1和u2都指向包含該物件的記憶體位置 執行結果 在c 中,基本資料型別如bool和...