【四】使用列舉和結構來建立值型別

林堯彬發表於2020-04-04

enum Season {Spring=0,Summer=22,Fall,Autumn=Fall,Winter=4}
Season colorful = Season.Fall;
string name = colorful.ToString();
Console.WriteLine(colorful);//輸出Fall
Console.WriteLine(name);//輸出Fall
Console.WriteLine((int)colorful);//輸出23,這裡注意23是因為summer的22加了1

列舉每個元素都關聯(對應)著一個整數值。叫做基礎整數值,或者基礎值。
如果不為列舉文字常量指定一個常量整數值,編譯器會自動為它指定比前一個列舉文字常量大1的值。
第一個列舉文字常量指定預設值是0
需要注意的是,多個列舉文字常量可以擁有相同的基礎值。

為了節省記憶體的話可以選擇
enum Season : short {Spring,Summer,Fall,Winter}

一個型別可以基於8種整數型別中的任何一種: byte,sbyte,short,ushort,int,uint,long,ulong 八種

可以對一個列舉可以執行數學運算,但假如運算結果超出列舉定義取值範圍,“執行時”唯一可以做的就是將變數的值解釋為對應的整數值。

//--------------------------------------------------
結構(struct):當類中只包含極少的資料,使用堆(heap)不合算,所以在棧(stack)上儲存,即定義為結構(struct)
tips:
string s = "42";
int i = int.Parse(s);//int.Parse(字串)是把字串轉化為int的方法

大多數的時候都不要將一個結構的欄位宣告為public欄位!否則無法保證public欄位總是包含有效值。

構造和類的區別:
①不能為結構宣告預設構造器(一個無參構造器)。
因為編譯器始終會幫我們生成一個預設的,並把欄位設為0,false或者null;
我們要保證預設構造器建立的結構值具有符合邏輯的行為,所以,也可以自己宣告一個非預設的構造器用來初始化(雖然編譯器扔會生成預設構造器)
此時!注意!自己寫的構造器中必須初始化所有的欄位!否則無法通過編譯。
②在類中可以在宣告一個例項欄位的時候同!時!初始化它,但在結構中不允許這樣。
結構中必須先宣告!然後讓編譯器預設初始化或者自己所有都初始化。

複製一個結構變數時,=操作符左側的結構變數的每個欄位都直接從右側結構變數的相應欄位中複製。
將一個結構變數賦值給另一個結構變數,前提是操作符=右邊的struct變數已經被完全初始化(即所有欄位已經被初始化了)

不自己寫初始化的話,編譯器就會預設初始化0、false、null。

//--以下內容很需要注意!!!!!!!!!!!!!!!!!!!!!!!!!
非常重要:複製值型別的變數時,將獲得值的兩個副本。相反,複製一個引用型別的變數時,將獲得對同一個物件的兩個引用。
Person Ming = new Person();
Person Gang = new Person();
Ming.Age = 23;
Gang = Ming;//這裡其實是讓Ming和Gang都引用了之前Ming對應的堆記憶體
Gang.Age = 25;
Console.WriteLine(Ming.Age);//輸出值為25。
//--------------------------------------------------------
以上這點在結構這裡同樣有參考價值!

結構是值型別,複製值型別的變數會創造變數中所有資料的一個副本。
然而類是引用型別,複製引用型別變數複製的是對原始變數的引用!而類變數中資料傳送改變的話,這個變數的所有引用都會變。

轉載於:https://www.cnblogs.com/codetochangetheworld/p/4229350.html

相關文章