一 什么是結構
結構是程式員定義的資料型別,有資料成員和函式成員,和類非常類似,
- 類是參考型別,而結構是值型別;
- 結構和類一樣可以實作介面;
- 結構是隱式密封的,不能被派生;
- 結構型別的變數不能為null;
- 兩個結構的變數不能參考同一物件;
- 在結構中不允許欄位初始化陳述句;
- 預定義簡單型別(如int,long,short 等等. . . ),實際上在.Net中都實作為結構,
class CSimple { public int X; public int Y; } struct Simple { public int X; public int Y;
// public int Z = 10 ; 編譯錯誤,不允許初始化欄位 } static void Main() { CSimple cs = new CSimple(); Simple ss = new Simple(); }

二 建構式
結構可以有實體建構式和靜態建構式,但不能有解構式,
2.1 實體建構式
結構隱式有一個無參的建構式,這個建構式把結構的每個成員設定為該型別的默認值,值成員設定成其默認值,參考成員設定成null,
預定義的無參建構式對每個結構都存在,可以創建另外的建構式,只要它們有引數,這一點和類不同,對于類,編譯器只在沒有其他建構式存在時才提供隱式的無參建構式,
struct Simple { public int X; public int Y; public Simple(int a, int b) { X = a; Y = b; } } class Program { static void Main(string[] args) { var s1 = new Simple(); var s2 = new Simple(5, 10); Console.WriteLine($"s1:{s1.X},{s1.Y}"); Console.WriteLine($"s2:{s2.X},{s2.Y}"); } }
2.2 靜態建構式
與類類似,結構的靜態建構式創建并初始化靜態資料成員,且不能參考實體成員,
以下任意一種行為發生前,將會呼叫靜態建構式:
- 呼叫顯示宣告的建構式;
- 參考結構的靜態成員,
三 結構作為回傳值和引數
- 回傳值:當結構作為回傳值時,將創建它的副本并回傳;
- 值引數:當結構被用作值引數時,將創建實參結構副本,用于方法體內執行;
- ref和out引數:如果一個結構被用作ref或out引數,傳入方法的是該結構的一個參考,這樣就可以修改其資料成員,
四 什么是列舉
列舉是由程式員定義的型別,與類或結構一樣,
- 與結構一樣,列舉是值型別;
- 列舉只有一種型別的成員:命名的整數常量值;
- 不能對成員使用修飾符,成員隱式地具有和列舉相同的可訪問性;
- 比較不同列舉型別的成員會導致編譯時錯誤,
每個列舉成員都有一個底層整數型別,默認為int,
- 每個列舉成員都被賦予一個底層型別的常量值;
- 默認下,編譯器把第一個成員賦值為0,后續成員比前一成員多1,
enum TrafficLight { Green, Yellow, Red } class Program { static void Main(string[] args) { var t1 = TrafficLight.Green; var t2 = TrafficLight.Yellow; var t3 = TrafficLight.Red; Console.WriteLine($"{t1},{(int)t1}"); Console.WriteLine($"{t2},{(int)t2}"); Console.WriteLine($"{t3},{(int)t3}"); Console.ReadLine(); } } 輸出: Green,0 Yellow,1 Red,2
五 設定列舉的底層型別和顯示值
enum TrafficLight : byte { Green = 2, Yellow, //未顯示設定值,則默認比上一個成員的值多1 Red = 10 } class Program { static void Main(string[] args) { var t1 = TrafficLight.Green; var t2 = TrafficLight.Yellow; var t3 = TrafficLight.Red; Console.WriteLine($"{t1},{(byte)t1}"); Console.WriteLine($"{t2},{(byte)t2}"); Console.WriteLine($"{t3},{(byte)t3}"); Console.ReadLine(); } } 輸出: Green,2 Yellow,3 Red,10
六 Enum類
6.1 .Net中的Enum類
.Net中的Enum類提供一些靜態方法:
- GetName方法以列舉型別物件和整數作為引數,回傳回應的列舉成員的名稱;
- GetNames方法以列舉型別物件為引數,回傳該列舉中所有成員的全部名稱,
enum TrafficLight { Green, Yellow, Red } class Program { static void Main(string[] args) { Console.WriteLine($"Second member is {Enum.GetName(typeof(TrafficLight),1)}"); foreach (var name in Enum.GetNames(typeof(TrafficLight))) { Console.WriteLine(name); } Console.Read(); } } 輸出: Second member is Yellow Green Yellow Red
6.2 Enum類的擴展方法
有時,專案中需要獲取列舉成員的詳細描述或中文名稱,可以通過Description特性配合自定義的Enum類擴展方法,來方便獲取,
public static class EnumHelper {
// Enum類的擴展方法 /// <summary> /// 獲取列舉值上的Description特性的說明 /// </summary> /// <param name="enumValue">列舉值</param> /// <returns>特性說明</returns> public static string GetEnumDescription(this Enum enumValue) { if (enumValue =https://www.cnblogs.com/wwwen/archive/2022/03/16/= null) return string.Empty; var field = enumValue.GetType().GetField(enumValue.ToString()); if (field == null) return string.Empty; return Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) is DescriptionAttribute description ? description.Description : field.ToString(); } } enum TrafficLight { [Description("綠色交通燈")] Green, [Description("黃色交通燈")] Yellow, [Description("紅色交通燈")] Red } class Program { static void Main(string[] args) { Console.WriteLine(TrafficLight.Green.GetEnumDescription()); Console.Read(); } } 輸出: 綠色交通燈
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/445254.html
標籤:.NET技术
