1. 程式人生 > >C#中Struct與Class的區別

C#中Struct與Class的區別

而是 適用於 ack 定義 cts 多態 支持 關鍵字 for

class和struct最本質的區別是class是引用類型,而struct是值類型,它們在內存中的分配情況有所區別。

什麽是class?

class(類)是面向對象編程的基本概念,是一種自定義數據結構類型,通常包含字段、屬性、方法、屬性、構造函數、索引器、操作符等。在.NET中,所有的類都最終繼承自System.Object類,因此是一種引用類型,也就是說,new一個類的實例時,在堆棧(stack)上存放該實例在托管堆(managed heap)中的地址,而實例的值保存在托管堆(managed heap)中。

什麽是struct?

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

1class 是引用類型,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的區別