C#學習筆記(1):資料型別
以《C#6.0本質論(Essential C# 6.0)》為基本,參考《深入解析C#(C# in Depth, 4th Edition)》、《C#圖解教程(Illustrated C# 7, 5th Edition)》。圓括號內是本質論書中位置、方括號是個人補充
資料型別
值型別
值型別的變數和臨時值經常是儲存在稱為棧的臨時儲存池中(P237)
除了string和object是引用型別,所有C#“內建”型別都是值型別(P239)
字面量
引用型別
引用型別的變數儲存的是引用(通常是記憶體地址),要去記憶體地址找到物件例項的資料......所以引用型別的變數關聯了兩個儲存位置:直接和變數關聯的儲存位置【堆】,以及由變數中儲存的值引用的儲存位置【棧】(P237)
字串
string型別的關鍵特徵在於它是不可變的(immutable)(P35)
null和void
null表示將變數設為“無”。null值只能賦值給引用型別、指標型別和可空型別(P37)
和根本不賦值相比,將null賦給引用型別的變數是完全不同的概念。賦值為null的變數已被設定,而未賦值的變數未被設定。將null值賦給一個string變數,並不等同於將空字元“”賦給它。null意味著變數無任何值,而“”意味著變數有一個稱為空字串的值。(P37)
var
var告訴編譯器:應該由編譯器根據宣告時所賦的值推斷資料型別(P38)
結構
結構不允許包含使用者定義的預設(無參)構造器。而當沒有提供預設的構造器時,C#編譯器自動地產生一個預設的構造器將所有欄位初始化為各自的預設值(P240)
資料轉換
顯式轉型是交給”執行時“,但是執行時可能引發異常(P42)
裝箱開箱
裝箱
- 從值型別的變數(直接引用其資料)轉換成引用型別(引用堆上的一個位置)時,會涉及以下幾個步驟:在堆上分配記憶體 >> 接著發生一次記憶體賦值 >> 轉換結果是對堆上的新儲存位置的引用。(P243)
- 裝箱影響效能和行為(P243)
拆箱
拆箱轉換先檢查已裝箱的值的型別兼容於要拆箱成的值的型別,然後複製堆中儲存的值(P243)
列舉
- 關鍵特徵是在編譯時聲明瞭一組可以通過名稱來引用的常量值(P249)
- 預設第一個列舉值是0,後續每一項都遞增1(P250)
- 若顯示賦值為x,所以它後面的值會遞增1(P250)
良構型別
重寫ToString()
重寫GetHashCode()
ReferenceEquals()的靜態方法,能顯示地檢查物件同一性......引用的相等性並不是唯一“相等性”(P261)
重寫Equals()
資料相等,應當是標識資料必須相等(P264)
操作符過載
轉換模式是:在一個方向顯式,相反方向上隱式(P272)