C#結構體和類的區別

C#結構體和類的區別

類和結構是 .NET Framework 中的常規類型系統的兩種基本構造.

值類型與引用類型

結構

結構是值類型,值類型在堆棧上分配地址,所有的基類型都是結構類型,例如:int 對應System.int32 結構,string 對應 system.string 結構 ,通過使用結構可以創建更多的值類型。

類是引用類型,引用類型在堆(程序的局部變量存在於(堆棧)中,全局變量存在於(靜態區 )中,動態申請數據存在於( 堆)中。)上分配地址。

堆棧的執行效率要比堆的執行效率高,可是堆棧的資源有限,不適合處理大的邏輯複雜的對象。所以結構處理作爲基類型對待的小對象,而類處理某個商業邏輯。

因爲結構是值類型所以結構之間的賦值可以創建新的結構,而類是引用類型,類之間的賦值只是複製引用。

結構的特點:

結構與類共享大多數相同的語法,但結構比類受到的限制更多:

在結構聲明中,除非字段被聲明爲 const或 static,否則無法初始化。

結構不能聲明默認構造函數(沒有參數的構造函數)或析構函數。

結構在賦值時進行復制。 將結構賦值給新變量時,將複製所有數據,並且對新副本所做的任何修改不會更改原始副本的數據。在使用值類型的集合(如 Dictionary<string, myStruct>)時,請務必記住這一點。

結構是值類型,而類是引用類型。

與類不同,結構的實例化可以不使用 new 運算符。

using System;
public struct CoOrds
{
   public int x, y;
        
   public CoOrds(int p1, int p2)
   {
       this.x = p1;
       this.y = p2;
   }
 
         publicvoid Show()
         {
        
         }
        
}
 
class TestCoOrdsNoNew
{
   static void Main()
   {
       // Declare an object:
       CoOrds coords1;//如果是類必須new出結構體可以不new 但是字段必須是public
 
       // Initialize:
       coords1.x = 10;
       coords1.y = 20;
       // Display results:
       Console.Write("CoOrds 1: ");
       Console.WriteLine("x = {0}, y = {1}", coords1.x, coords1.y);
 
       // Keep the console window open in debug mode.
       Console.WriteLine("Press any key to exit.");
       Console.ReadKey();
   }
}
 


結構可以聲明帶參數的構造函數。

一個結構不能從另一個結構或類繼承,而且不能作爲一個類的基。 所有結構都直接繼承自System.ValueType,後者繼承自System.Object。

結構可以實現接口。

interfaceIImage
{
    void Paint();
}
 
struct Picture : IImage
{
    public void Paint()
    {
         // painting code goes here
    }
    
    private int x, y, z;
   // other struct members
}


結構可用作可以爲 null 的類型,因而可向其賦 null 值。

 

總的來說,實際上適合用 struct 的範圍是比較侷限的,以下可以考慮使用:

行爲與基元類型一樣。

具有 16 字節以下的實例大小。

是不可改變的。

值語義是合意的。

 

發佈了38 篇原創文章 · 獲贊 13 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章