1. 程式人生 > >C# 中 Struct 和 Class 的區別總結

C# 中 Struct 和 Class 的區別總結

> 翻譯自 Manju lata Yadav 2019年6月2日 的博文 [《Difference Between Struct And Class In C#》](https://www.c-sharpcorner.com/blogs/difference-between-struct-and-class-in-c-sharp),補充了一些內容和示例。 結構體(`struct`)是類(`class`)的輕量級版本。結構體是值型別,可用於建立行為類似於內建型別的物件。 ## 比較 結構體和類共享許多特性,但與類相比有以下侷限性。 - 結構體不能有預設建構函式(無參建構函式)或解構函式,建構函式中必須給所有欄位賦值。 ```csharp public struct Coords { public double x; public double y; public Coords() //錯誤,不允許無參建構函式 { this.x = 3; this.y = 4; } public Coords(double x) //錯誤,建構函式中必須給所有欄位賦值 { this.x = x; } public Coords(double x) //這個是正確的 { this.x = x; this.y = 4; } public Coords(double x, double y) //這個是正確的 { this.x = x; this.y = y; } } ``` - 結構體是值型別,在賦值時進行復制。 - 結構體是值型別,而類是引用型別。 - 結構體可以在不使用 `new` 操作符的情況下例項化。 例如: ```csharp public struct Coords { public double x; public double y; } static void Main() { Coords p; p.x = 3; p.y = 4; Console.WriteLine($"({p.x}, {p.y})"); // 輸出: (3, 4) } ``` - 結構體不能繼承於另一個結構體或者類,類也不能繼承結構體。所有結構體都直接繼承於抽象類 [`System.ValueType`](https://docs.microsoft.com/zh-cn/dotnet/api/system.valuetype),`System.ValueType` 又繼承於 `System.Object`。 - 結構體不能是基類,因此,結構體不能是 `abstract` 的,且總是隱式密封的(`sealed`)。 - 不允許對結構體使用抽象(`abstract`)和密封(`sealed`)修飾符,也不允許對結構體成員使用 `protected` 或 `protected internal` 修飾符。 - 結構體中的函式成員不能是抽象的(`abstract`)或虛的(`virtual`),重寫(`override`)修飾符只允許重寫從 `System.ValueType` 繼承的方法。 - 結構體中不允許例項屬性或欄位包含初始值設定項。但是,結構體允許靜態屬性或欄位包含初始值設定項。 例如: ```csharp public struct Coords { public double x = 4; //錯誤, 結構體中初始化器不允許例項欄位設定初始值 public static double y = 5; // 正確 public static double z { get; set; } = 6; // 正確 } ``` - 結構體可以實現介面。 - 結構體可以用作 `nullable type`(即:`