C#中Struct與Class的區別

來源:互聯網
上載者:User

標籤:編程   har   儲存   一個   賦值   分配   程式   ted   應用程式   

 

class和struct最本質的區別是class是參考型別,而struct是實值型別,它們在記憶體中的分配情況有所區別。

什麼是class?

class(類)是物件導向編程的基本概念,是一種自訂資料結構類型,通常包含欄位、屬性、方法、屬性、建構函式、索引器、操作符等。在.NET中,所有的類都最終繼承自System.Object類,因此是一種參考型別,也就是說,new一個類的執行個體時,在堆棧(stack)上存放該執行個體在託管堆(managed heap)中的地址,而執行個體的值儲存在託管堆(managed heap)中。

什麼是struct?

struct(結構)是一種實值型別,用於將一組相關的變數組織為一個單一的變數實體 。所有的結構都繼承自System.ValueType類,因此是一種實值型別,也就是說,struct執行個體在建立時分配線上程的堆棧(stack)上,它本身儲存了值。所以在使用struct時,我們可以將其當作int、char這樣的基本類型類對待。

 

1,class 是參考型別,structs是實值型別

既然class是參考型別,class可以設為null。但是我們不能將struct設為null,因為它是實值型別。

                       

namespace Ax

{

    public partial class Form3 : Form

    {

        public Form3()

        {

            InitializeComponent();

            structA x = null; //錯誤    :無法將 Null 轉換成“structA”,因為它是一種不可以為 null 值的類型   

            classA y = null;

        }

    }

}

 

public struct structA

{

    public int A;

}

 

public class classA

{

    public int A;

}

 

 

2,當你執行個體化一個class,它將建立在堆上。而你執行個體化一個struct,它將建立在棧上

3,你使用的是一個對class執行個體的引用。而你使用的不是對一個struct的引用。(而是直接使用它們)

4,當我們將class作為參數傳給一個方法,我們傳遞的是一個引用。struct傳遞的是值而非引用。

5,structs 不可以有初始化器,class可以有初始化器。

 

public struct structA

{

    //public int A = 90; //錯誤:“structA.A”: 結構中不能有執行個體欄位初始值

    public int A;

 

}

 

public class classA

{

    public int A = 90;

}

 

 

6,Classes 可以有明顯的無參數構造器,但是Struct不可以

 

public struct structA

{

    //public int A = 90; //錯誤:“structA.A”: 結構中不能有執行個體欄位初始值

    public int A;

    //public structA() //錯誤:結構不能包含顯式的無參數建構函式

    //{

    //    this.A = 0;

    //}

 

    public structA(int paraA) //ok

    {

        this.A = paraA;

    }

}

 

public class classA

{

    public int A = 90;

    public classA()

    {

        this.A = 90;

    }

}

 

 

7,類使用前必須new關鍵字執行個體化,Struct不需要

 

        public Form3()

        {

            InitializeComponent();

            //structA x = null; //錯誤    :無法將 Null 轉換成“structA”,因為它是一種不可以為 null 值的類型   

            structA x;

            x.A = 8;

            structA x2 = new structA();

            x2.A = 32;

            classA y = null;

            classA y1 = new classA();

            y1.A = 4;

            classA y2;

            //y2.A = 5;//錯誤:使用了未賦值的局部變數“y2”

        }

 

 

8,class支援繼承和多態,Struct不支援. 注意:但是Struct 可以和類一樣實現介面

9,既然Struct不支援繼承,其成員不能以protected 或Protected Internal 修飾

10,Class的構造器不需要初始化全部欄位,Struct的構造器必須初始化所有欄位

 

 

public struct structA

{

    public int A;

    public int B;

 

    public structA(int paraA, int paraB) //ok

    {

        this.A = paraA;

        this.B = paraB;

    }

 

    //public structA(int paraA) //ok

    //{

    //    this.A = paraA;

    //    this.B = paraA;

    //}

 

    //public structA(int paraA, int paraB) //錯誤:在控制返回調用方之前,欄位“structA.B”必須被完全賦值

    //{

    //    this.A = paraA;

    //}

}

 

public class classA

{

    public int A = 90;

    public int B;

    public classA()

    {

        this.A = 90;

    }

}

 

 

 

11,Class可以定義析構器,但是Struct不可以

12,Class比較適合大的和複雜的資料,Struct適用於作為經常使用的一些資料群組合成的新類型。

 

適用場合:Struct有效能優勢,Class有物件導向的擴充優勢。

用於底層資料存放區的類型設計為Struct類型,將用於定義應用程式行為的類型設計為Class。如果對類型將來的應用情況不能確定,應該使用Class。

 

C#中Struct與Class的區別

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.