標籤:傳遞 info body 整型 類型轉換 object 特點 不同的 資訊
深入C#資料類型
1.實值型別和參考型別
1.實值型別:直接把資料類型儲存在棧中
問題:已知李明和張浩去年的身高都為170cm,而今年李明身高長到了180cm,張浩沒有變化,輸出去年和今年兩人的身高
代碼:
int heightzhang = 170;
int heightLi = heightzhang;
Console.WriteLine("張浩的身高為:{0} 李明的身高為:{1}",heightzhang,heightLi);
heightLi = 180;
Console.WriteLine("張浩的身高為:{0} 李明的身高為:{1}", heightzhang, heightLi);
Console.ReadLine();
小結:實值型別:不同的變了會分配不同的儲存空間,儲存空間中儲存的是該變了的值,改變一個變數值不會影響另一個變數值
2.參考型別:直接把資料類型儲存在堆中
1.問題:已知李明和張浩去年的身高都為170cm體重都為60kg,而今年李明身高長到了180cm體重長到70kg,張浩沒有變化,輸出去年和今年兩人的身高
代碼:
int[] li = { 170,60};
int[] zhang = li;
Console.WriteLine("去年—張浩身高為:{0} 體重為:{1} 李明身高為:{2} 體重為:{3}",zhang[0],zhang[1],li[0],li[1]);
li[0] = 180;
li[1] = 70;
Console.WriteLine("去年—張浩身高為:{0} 體重為:{1} 李明身高為:{2} 體重為:{3}", zhang[0], zhang[1], li[0], li[1]);
Console.ReadLine();
為什麼會出現張浩和李明的值都改變了呢?
首先,系統分配了一段空間建立數組,用來儲存資訊,標識符Li只是一個引用,它指向了記憶體中建立的這個數組,然後程程式引用Li賦值給zhang因為zhang並沒有分配一段儲存空間,
而是和Li使用了同一段儲存空間,所以後面的程式在修改黎明的身高和體重時也同樣修改了張浩的資訊。
圖片概括了變化過程:
小結:對參考型別,賦值是把元對象引用傳遞給另一個引用。對數組而言,當一個數組賦值給另一個引用後,這兩個音樂只想同一個數組,也就是只想用 一Block Storage空間
1.結構
1.結構的定義
存取修飾詞 struct 結構名
{
//結構體
}
結構的定義有以下特點:
結構中可以有欄位
定義時,結構中的欄位不能被賦值
2.結構的使用
可以不用new,直接定義結構的對象即可
聲明結果的對象後,必須給結果的成員賦初始值
小結:結構是實值型別,聲明結構變數就儲存一個結構的新副本,及系統要開闢一塊新的儲存空間,因此結構用得越多所消耗的儲存空間也越多
2.裝箱和拆箱
定義將實值型別轉換為參考型別的過程稱為裝箱,反之成為拆箱。
1.裝箱
當改變i的值時,因為i是實值型別,所以只能改變它自己的值,而無法修改參考型別object的類型。可以理解為建立一個object執行個體,並將i的值複製給object
2.拆箱
先將之類型i進行裝箱,然後把轉換後的參考型別o進行拆箱處理,切記拆箱時,被轉換參考型別的數值必須能夠轉換為目標實值型別。
經驗:在實際開發中,應該盡量減少不必要的裝箱和拆箱,因為二者的儲存方式不同,轉換時效能損失較大。
總結
*基礎資料型別 (Elementary Data Type),如整型、浮點型字元型、bool型及結構屬於實值型別;數組、介面和類屬於參考型別
*結構是實值型別資料,可以看成輕量級的類,使用的時候可以不用new
*實值型別轉換為參考型別稱為裝箱,反之稱為拆箱
深入C#資料類型