中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

一文帶你讀懂C#中的struct結構體

發布時間:2020-11-07 15:34:17 來源:億速云 閱讀:172 作者:Leah 欄目:開發技術

這篇文章運用簡單易懂的例子給大家介紹一文帶你讀懂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;

結構體遵循其他數據類型都遵守的規則:在使用前所有元素都必須進行初始化。

結構體的初始化方法:

  • 使用new運算符
  • 給所有的字段直接賦值
     

結構體性能影響

  • 為結構體分配內存時,速度非常快,因為它們將內聯或者保存在棧中。結構體超出作用域被刪除時,速度也很快,不需要等待垃圾收集。
  • 如果把結構體作為參數來傳遞,或者把一個結構體賦值給另一個結構體,結構體的所有內容就會被復制;這樣就會有性能損失。這也是為什么結構體主要用于小的數據結構。
  • 把結構體作為參數傳遞給方法時,應該把它作為ref參數傳遞 - 此時只傳遞了結構體在內存中地址。
     

只讀結構體

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結構體就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

西丰县| 长海县| 恭城| 华亭县| 岢岚县| 和顺县| 松阳县| 永和县| 米易县| 木兰县| 昌宁县| 淮安市| 阳西县| 铁岭市| 和平县| 左贡县| 鸡西市| 淮阳县| 枝江市| 洱源县| 威宁| 哈尔滨市| 靖安县| 长岛县| 东山县| 新宁县| 丰原市| 荔波县| 龙山县| 屏南县| 丰县| 门源| 海盐县| 综艺| 富源县| 高密市| 浠水县| 外汇| 福安市| 伊吾县| 灵石县|