您好,登錄后才能下訂單哦!
這篇文章運用簡單易懂的例子給大家介紹一文帶你讀懂C#中的struct結構體,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
結構體
有時候我們僅需要一個小的數據結構,類提供的功能多于我們需要的功能;考慮到性能原因,最好使用結構體。
結構體是值類型,存儲在棧中或存儲為內聯(如果結構體是存儲在堆中的另一個對象的一部分)。
例如類class:
public class Dimensions { public Dimensions(double length, double width) { Length = length; Width = width; } public double Length { get; set; } public double Width { get; set; } }
可以使用結構體struct替換:
public struct Dimensions { public Dimensions(double length, double width) { Length = length; Width = width; } public double Length { get; set; } public double Width { get; set; } }
也可以為結構體struct創建函數,和給類創建函數完全相同:
public struct Dimensions { public Dimensions(double length, double width) { Length = length; Width = width; } public double Length { get; set; } public double Width { get; set; } public double Diagonal => Math.Sqrt(Length * Length + Width * Width); }
結構體初始化
結構體是值類型,但在使用時的語法和類基本一模一樣。例如對于上面定義的類或結構體,均可使用代碼:
Dimensions point = new Dimensions(3, 6);
注意:
因為結構體是值類型,所以new運算符與類和其他引用類型的工作方式不同。
用于結構體struct的new運算符并不分配堆中的內存,而是只調用相應的構造函數,根據傳送給它的參數,初始化所有字段。
對于結構,變量聲明實際上是韋整個結構在棧中分配空間。例如用如下語法(如果是類的話,就會編譯錯誤):
Dimensions point; //直接省略new point.Length = 3; point.Width = 6;
結構體遵循其他數據類型都遵守的規則:在使用前所有元素都必須進行初始化。
結構體的初始化方法:
結構體性能影響
只讀結構體
C#7.2開始,readonly修飾符可以應用于結構體struct,因此編譯器保證結構體的不變性。
public readonly struct Dimensions { public Dimensions(double length, double width) { Length = length; Width = width; } public double Length { get; } public double Width { get; } public double Diagonal => Math.Sqrt(Length * Length + Width * Width); }
對于readonly修飾符,如果在創建對象后類型更改了字段或屬性,編譯器就會報錯。
使用readonly編譯器可以生成優化的代碼,使其在傳遞結構體時不會復制結構體的內容;
相反,編譯器使用引用,因為它永遠不會改變。
注意:上面readonly結構體的屬性是只讀的,只有get;如果有set的話,編譯會報錯:
error CS8341: Auto-implemented instance properties in readonly structs must be readonly.
結構體和類 - 值類型和引用類型
using System; namespace value_reference { public struct A { public int x { get; set; } } public class B { public int x { get; set; } } class Program { public static void UpdateStructValue(A a) { a.x = 10; } public static void UpdateObjectValue(B b) { b.x = 10; } static void Main(string[] args) { var a = new A { x = 1 }; var b = new B { x = 1 }; UpdateStructValue(a); UpdateObjectValue(b); Console.WriteLine($"a.x -> {a.x}"); Console.WriteLine($"b.x -> {b.x}"); } } }
輸出結果:
$ dotnet run
a.x -> 1
b.x -> 10
關于一文帶你讀懂C#中的struct結構體就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。