亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

淺析C# 結(jié)構(gòu)體struct

 更新時(shí)間:2020年08月25日 11:20:20   作者:編碼者頻道  
這篇文章主要介紹了C# 結(jié)構(gòu)體struct 的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c#,感興趣的朋友可以了解下

結(jié)構(gòu)體

有時(shí)候我們僅需要一個(gè)小的數(shù)據(jù)結(jié)構(gòu),類提供的功能多于我們需要的功能;考慮到性能原因,最好使用結(jié)構(gòu)體。

結(jié)構(gòu)體是值類型,存儲(chǔ)在棧中或存儲(chǔ)為內(nèi)聯(lián)(如果結(jié)構(gòu)體是存儲(chǔ)在堆中的另一個(gè)對(duì)象的一部分)。

例如類class:

public class Dimensions
{
  public Dimensions(double length, double width)
  {
    Length = length;
    Width = width;
  }
  public double Length { get; set; }
  public double Width { get; set; }
}

可以使用結(jié)構(gòu)體struct替換:

public struct Dimensions
{
  public Dimensions(double length, double width)
  {
    Length = length;
    Width = width;
  }
  public double Length { get; set; }
  public double Width { get; set; }
}

也可以為結(jié)構(gòu)體struct創(chuàng)建函數(shù),和給類創(chuàng)建函數(shù)完全相同:

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);
}

結(jié)構(gòu)體初始化

結(jié)構(gòu)體是值類型,但在使用時(shí)的語(yǔ)法和類基本一模一樣。例如對(duì)于上面定義的類或結(jié)構(gòu)體,均可使用代碼:

Dimensions point = new Dimensions(3, 6);

注意:

因?yàn)榻Y(jié)構(gòu)體是值類型,所以new運(yùn)算符與類和其他引用類型的工作方式不同。

用于結(jié)構(gòu)體struct的new運(yùn)算符并不分配堆中的內(nèi)存,而是只調(diào)用相應(yīng)的構(gòu)造函數(shù),根據(jù)傳送給它的參數(shù),初始化所有字段。

對(duì)于結(jié)構(gòu),變量聲明實(shí)際上是韋整個(gè)結(jié)構(gòu)在棧中分配空間。例如用如下語(yǔ)法(如果是類的話,就會(huì)編譯錯(cuò)誤):

Dimensions point; //直接省略new
point.Length = 3;
point.Width = 6;

結(jié)構(gòu)體遵循其他數(shù)據(jù)類型都遵守的規(guī)則:在使用前所有元素都必須進(jìn)行初始化。

結(jié)構(gòu)體的初始化方法:

  • 使用new運(yùn)算符
  • 給所有的字段直接賦值

結(jié)構(gòu)體性能影響

  • 為結(jié)構(gòu)體分配內(nèi)存時(shí),速度非常快,因?yàn)樗鼈儗?nèi)聯(lián)或者保存在棧中。結(jié)構(gòu)體超出作用域被刪除時(shí),速度也很快,不需要等待垃圾收集。
  • 如果把結(jié)構(gòu)體作為參數(shù)來(lái)傳遞,或者把一個(gè)結(jié)構(gòu)體賦值給另一個(gè)結(jié)構(gòu)體,結(jié)構(gòu)體的所有內(nèi)容就會(huì)被復(fù)制;這樣就會(huì)有性能損失。這也是為什么結(jié)構(gòu)體主要用于小的數(shù)據(jù)結(jié)構(gòu)。
  • 把結(jié)構(gòu)體作為參數(shù)傳遞給方法時(shí),應(yīng)該把它作為ref參數(shù)傳遞 - 此時(shí)只傳遞了結(jié)構(gòu)體在內(nèi)存中地址。

只讀結(jié)構(gòu)體

C#7.2開始,readonly修飾符可以應(yīng)用于結(jié)構(gòu)體struct,因此編譯器保證結(jié)構(gòu)體的不變性。

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);
}

對(duì)于readonly修飾符,如果在創(chuàng)建對(duì)象后類型更改了字段或?qū)傩?,編譯器就會(huì)報(bào)錯(cuò)。

使用readonly編譯器可以生成優(yōu)化的代碼,使其在傳遞結(jié)構(gòu)體時(shí)不會(huì)復(fù)制結(jié)構(gòu)體的內(nèi)容;

相反,編譯器使用引用,因?yàn)樗肋h(yuǎn)不會(huì)改變。

注意:上面readonly結(jié)構(gòu)體的屬性是只讀的,只有g(shù)et;如果有set的話,編譯會(huì)報(bào)錯(cuò):

error CS8341: Auto-implemented instance properties in readonly structs must be readonly.

結(jié)構(gòu)體和類 - 值類型和引用類型

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}");
    }
  }
}

輸出結(jié)果:

$ dotnet run
a.x -> 1
b.x -> 10

以上就是淺析C# 結(jié)構(gòu)體struct 的詳細(xì)內(nèi)容,更多關(guān)于C# 結(jié)構(gòu)體struct 的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C# 微信支付 wx.chooseWXPay 簽名錯(cuò)誤的解決方法

    C# 微信支付 wx.chooseWXPay 簽名錯(cuò)誤的解決方法

    本篇文章主要介紹了C# 微信支付 wx.chooseWXPay 簽名錯(cuò)誤的解決方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2017-12-12
  • C#.net實(shí)現(xiàn)在Winform中從internet下載文件的方法

    C#.net實(shí)現(xiàn)在Winform中從internet下載文件的方法

    這篇文章主要介紹了C#.net實(shí)現(xiàn)在Winform中從internet下載文件的方法,實(shí)例分析了基于Winform實(shí)現(xiàn)文件下載的相關(guān)技巧,需要的朋友可以參考下
    2015-07-07
  • C#中OpenCvSharp 通過特征點(diǎn)匹配圖片的方法

    C#中OpenCvSharp 通過特征點(diǎn)匹配圖片的方法

    這篇文章主要介紹了OpenCvSharp 通過特征點(diǎn)匹配圖片的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • C#正則函數(shù)用法實(shí)例【匹配、替換、提取】

    C#正則函數(shù)用法實(shí)例【匹配、替換、提取】

    這篇文章主要介紹了C#正則函數(shù)用法,結(jié)合實(shí)例形式分析了C#基于正則的匹配、替換、提取相關(guān)操作技巧,需要的朋友可以參考下
    2017-01-01
  • C#編寫DES加密、解密類

    C#編寫DES加密、解密類

    本文給大家匯總了一下使用C#實(shí)現(xiàn)的DES加密、解密類的代碼,十分的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下
    2015-05-05
  • C#函數(shù)式編程中的惰性求值詳解

    C#函數(shù)式編程中的惰性求值詳解

    這篇文章主要介紹了C#函數(shù)式編程中的惰性求值詳解,本文講解了惰性求值的相關(guān)知識(shí)并給出代碼實(shí)例,需要的朋友可以參考下
    2015-01-01
  • C#實(shí)現(xiàn)簡(jiǎn)易點(diǎn)餐功能

    C#實(shí)現(xiàn)簡(jiǎn)易點(diǎn)餐功能

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)簡(jiǎn)易點(diǎn)餐功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Unity2D實(shí)現(xiàn)游戲回旋鏢

    Unity2D實(shí)現(xiàn)游戲回旋鏢

    這篇文章主要為大家詳細(xì)介紹了Unity2D實(shí)現(xiàn)游戲回旋鏢,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • unity實(shí)現(xiàn)簡(jiǎn)單貪吃蛇游戲

    unity實(shí)現(xiàn)簡(jiǎn)單貪吃蛇游戲

    這篇文章主要為大家詳細(xì)介紹了unity實(shí)現(xiàn)簡(jiǎn)單貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • 在winform中實(shí)現(xiàn)雙向數(shù)據(jù)綁定的方法

    在winform中實(shí)現(xiàn)雙向數(shù)據(jù)綁定的方法

    雙向數(shù)據(jù)綁定是一種允許我們創(chuàng)建持久連接的技術(shù),使模型數(shù)據(jù)和用戶界面(UI)之間的交互能夠自動(dòng)同步,今天我想通過winform中DataGridView控件為例,介紹在winform中如何實(shí)現(xiàn)雙向數(shù)據(jù)綁定,需要的朋友可以參考下
    2024-03-03

最新評(píng)論