你真的瞭解:類與結構嗎?(細談類與結構)

前言:在面向對象的動態編程中,封裝已經成爲了必不可少的需求,但是在封裝時我們又會遇到結構和類這兩種方法,那麼它們有什麼不同呢?我們分別在什麼情況下使用它們呢?下面跟隨腳步我們一起去一探究竟......

一.類與結構的概念:

1.類:

類是對於某一類對象的一個統稱,類是對象的抽象化,對象是類的實例。定義一個類時,相當於定義了一個數據類型的藍圖。但實際上並沒有定義任何的數據,但它定義了類的名稱意味着什麼,也就是說,類的對象由什麼組成及在這個對象上可執行什麼操作,就是單純的進行了一個定義。詳情請訪問:類的概念以及應用

2.結構:

結構體是值類型數據結構。它使得一個單一變量可以存儲各種數據類型的相關數據。struct 關鍵字用於創建結構體。結構體是用來代表一個記錄,一般的我們主要用結構體來封裝一些方法或者屬性,以便於調用,使用結構體一定程度上減少了代碼運算量,也可以說比較方便。詳情請訪問:結構體(sturt)的詳解

二.類與結構的特點:

1.類的特點:

類就是對象的抽象化概念,一個類就是一個對象集合的總稱,通俗的來講就是對象需要什麼這個類就提供什麼給對象,加入對象需要什麼數據這個類就提供什麼數據,對象需要什麼功能這個類就提供什麼功能;

2.結構體的特點:

  1. 結構可帶有方法、字段、索引、屬性、運算符方法和事件;
  2. 結構可定義構造函數,但不能定義析構函數。但是,不能爲結構定義無參構造函數。無參構造函數(默認)是自動定義的,且不能被改變;
  3. 結構不能繼承其他的結構或類;
  4. 結構不能作爲其他結構或類的基礎結構;
  5. 結構可實現一個或多個接口;
  6. 結構成員不能指定爲 abstractvirtualprotected;
  7. 結構可以不使用 New 操作符即可被實例化;
  8. 如果不使用 New 操作符,只有在所有的字段都被初始化之後,字段才被賦值,對象才被使用。

三.類與結構的聲明:

1.類的聲明以及引用:

一般的類的聲明爲:修飾符 class class_name { };
舉例:我們在下代碼中聲明瞭一個類,其中包含三個屬性:

    class student
    {
        public string name;
        public int age;
        public string sex;
    }

引用:
一般會用到new關鍵字進行對其的實例化操作:

 class Program
    {
        static void Main(string[] args)
        {
            student ss = new student();
            ss.name = "張三";
            Console.WriteLine("我的名字叫:{0}",ss.name);
            Console.ReadLine();
        }
    }

結果:
在這裏插入圖片描述

2.結構的聲明以及引用:

結構的聲明,一般形式爲:

struct struct_name
{
   //一些方法或屬性
}

舉例:

    struct SS
    {
        public string Name;
        public int Age;
        public string Sex;
    }

那麼我們應該如何調用我們所聲明的結構體呢?,其實方法和類特別相似,如下所示:

 class Program
    {
        static void Main(string[] args)
        {
            SS Ss = new SS();
            Ss.Name = "李四";
            Console.WriteLine("我的名字叫: {0}",Ss.Name);
            //student ss = new student();
            //ss.name = "張三";
            //Console.WriteLine("我的名字叫:{0}",ss.name);
            Console.ReadLine();
        }
     }

那麼估計會有小夥伴充滿疑惑,既然兩者看起來基本上都一樣,那麼會有什麼區別呢?,下面我們來主要說一說其的區別…

四.類與結構的區別(舉例說明):

  1. 類是引用類型,結構是值類型。
    引用類型:引用類型 由類型的實際值引用(類似於指針)表示的數據類型。如果爲某個變量分配一個引用類型,則該變量將引用(或“指向”)原始值。不創建任何副本。引用類型包括類、接口、委託和裝箱值類型。
    值類型:值類型直接將內存存儲在棧內,由系統自動釋放資源的數據類型。
  2. 結構不支持繼承。
    爲什麼結構不支持繼承呢?,原來結構也屬於密封類,密封類不能被繼承。將密封類用作基類是錯誤的。在類聲明中使用 sealed 修飾符可防止繼承此類。
    如果將結構繼承就會出現如下錯誤:
    在這裏插入圖片描述
    但是在類繼承時就不會出現錯誤:
    在這裏插入圖片描述
  3. 結構不能聲明默認的構造函數。
    默認的構造函數:默認構造函數(default constructor)就是在沒有顯式提供初始化式時調用的構造函數。它由不帶參數的構造函數,或者爲所有的形參提供默認實參的構造函數定義。如果定義某個類的變量時沒有提供初始化時就會使用默認構造函數。
    但是當我們採用面向對象方法編程,寫一個類的時候,其本身有一個默認的構造函數。struct結構體所寫的是一個數據對象不是一個類,只是一種編程者自己構造的數據類型,在其中我們不能手動創建無參的構造函數
    舉例:
        struct Person
        {
            public string name;
            public int age;
            public string sex;
          
            public Person() { }
         }

當然此代碼在編寫時會報錯,如下:
在這裏插入圖片描述
所以我們得謹記這些差別,不能將類與結構混淆!!

五.類與結構使用場景:

結構和類的適用場合:
1、當堆棧的空間很有限,且有大量的邏輯對象時,創建類要比創建結構好一些;
2、對於點、矩形和顏色這樣的輕量對象,假如要聲明一個含有許多個顏色對象的數組,則CLR需要爲每個對象分配內存,在這種情況下,使用結構的成本較低;
3、在表現抽象和多級別的對象層次時,類是最好的選擇,因爲結構不支持繼承。
4、大多數情況下,目標類型只是含有一些數據,或者以數據爲主。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章