溫馨提示×

溫馨提示×

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

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

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

發(fā)布時(shí)間:2020-07-18 14:25:23 來源:億速云 閱讀:143 作者:小豬 欄目:編程語言

小編這次要給大家分享的是淺談C#結(jié)構(gòu)體,文章內(nèi)容豐富,感興趣的小伙伴可以來了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。

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

  在C#中,結(jié)構(gòu)體是值類型,一般適用于表示類似Point、Rectangle、Color的對象

  值類型能夠降低對堆的管理、使用。降低垃圾回收,表現(xiàn)出更好的性能。可是值類型也有不好的一面。會(huì)涉及到裝箱拆箱等操作

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

  結(jié)構(gòu)體聲明定義了一種新的數(shù)據(jù)類型,這個(gè)數(shù)據(jù)類型可以為程序包含一個(gè)以上的成員變量

  要定義一個(gè)結(jié)構(gòu),需要使用struct語句

聲明一個(gè)學(xué)校的結(jié)構(gòu)

struct School
{
  public int name;
  public string head_master;
  public int class_number;
  public int student_number;
};

結(jié)構(gòu)體的使用

using System;

struct School
{
  public int school_id;
  public string head_master;
  public int class_number;
  public int student_number;
};

public class testStructure
{
  public static void Main(string[] args)
  {
    School TianYangHighSchool; // 聲明一個(gè)學(xué)校

    // 學(xué)校詳細(xì)
    TianYangHighSchool.school_id = 12345;
    TianYangHighSchool.head_master = "Tynam.Yang";
    TianYangHighSchool.class_number = 6;
    TianYangHighSchool.student_number = 456;

    // 打印學(xué)校信息
    Console.WriteLine("田陽高中學(xué)校的學(xué)校id是:{0}," +
      "校長名字是:{1}," +
      "一共有{2}個(gè)教室," +
      "總共有{3}名學(xué)校",
      TianYangHighSchool.school_id,
      TianYangHighSchool.head_master,
      TianYangHighSchool.class_number,
      TianYangHighSchool.student_number);

    Console.ReadKey();
  }
}

運(yùn)行結(jié)果

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

結(jié)構(gòu)體特點(diǎn)

  結(jié)構(gòu)體可以有方法,字段,索引器,屬性,操作符方法和事件

  結(jié)構(gòu)體可以有定義的構(gòu)造函數(shù),但不能是析構(gòu)函數(shù)。但是不能為結(jié)構(gòu)定義默認(rèn)構(gòu)造函數(shù)。默認(rèn)構(gòu)造函數(shù)是自動(dòng)定義的,不能被更改

  與類不同,結(jié)構(gòu)體不能繼承其他結(jié)構(gòu)體或類

  結(jié)構(gòu)體不能用作其他結(jié)構(gòu)或類的基礎(chǔ)

  結(jié)構(gòu)體可以實(shí)現(xiàn)一個(gè)或多個(gè)接口

  結(jié)構(gòu)成員不能被指定為抽象,虛擬或受保護(hù)

  當(dāng)使用New運(yùn)算符創(chuàng)建一個(gè)struct對象時(shí),它將調(diào)用相應(yīng)的構(gòu)造函數(shù)。 與類不同,可以在不使用New運(yùn)算符的情況下實(shí)例化結(jié)構(gòu)體

  如果不使用New運(yùn)算符,則字段保持未分配,并且在所有字段初始化之前不能使用對象

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

  結(jié)構(gòu)體是值類型,存儲在棧上,類是引用類型,存儲在托管堆上,結(jié)構(gòu)體在聲明的時(shí)候就已經(jīng)為其分配棧上的內(nèi)存了,而類需要用 new為其分配堆上面的內(nèi)存

  結(jié)構(gòu)體是隱式密封的,不能用 sealed 和 abstract 修飾,結(jié)構(gòu)體不能被繼承,類可以被繼承

  結(jié)構(gòu)體中的實(shí)例字段只能聲明,不能賦值,而類沒有限制,結(jié)構(gòu)體只聲明沒有用 new 進(jìn)行初始化時(shí),可以給他的實(shí)例字段賦值,而類不行

  結(jié)構(gòu)體沒有析構(gòu)函數(shù),結(jié)構(gòu)體中的方法不能用 virtual 和 abstract 修飾,但是可以用 override 修飾,用來重寫父類的方法

  結(jié)構(gòu)體不能顯示給出默認(rèn)構(gòu)造函數(shù)(無參數(shù)的構(gòu)造),無論有沒有自定義構(gòu)造,默認(rèn)構(gòu)造都隱式存在,而類中有自定義構(gòu)造函數(shù)時(shí),默認(rèn)構(gòu)造會(huì)被隱藏,要想調(diào)用默認(rèn)構(gòu)造,必須顯示給出默認(rèn)構(gòu)造

  結(jié)構(gòu)體的自定義構(gòu)造函數(shù)必須初始化所有的實(shí)例字段和沒有初始化的非靜態(tài)屬性,類沒有限制

結(jié)構(gòu)與類的選擇

  堆棧的空間有限,對于大量的邏輯的對象,創(chuàng)建類要比創(chuàng)建結(jié)構(gòu)好一些

  結(jié)構(gòu)表示如點(diǎn)、矩形和顏色這樣的輕量對象,例如,如果聲明一個(gè)含有 1000 個(gè)點(diǎn)對象的數(shù)組,則將為引用每個(gè)對象分配附加的內(nèi)存。在此情況下,結(jié)構(gòu)的成本較低

  在表現(xiàn)抽象和多級別的對象層次時(shí),類是最好的選擇

  大多數(shù)情況下該類型只是一些數(shù)據(jù)時(shí),結(jié)構(gòu)時(shí)最佳的選擇體的使用

看完這篇關(guān)于淺談C#結(jié)構(gòu)體的文章,如果覺得文章內(nèi)容寫得不錯(cuò)的話,可以把它分享出去給更多人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI