C# struct和class的比較

  什麼是class?
  class是我們通常所說的類,是面向對象編程的基本概念,一種可以自定義的數據結構類型,C#中的class通常包含字段、屬性、方法、構造函數、索引器、操作符等等。在.NET中,所有的類都最終繼承自System.Object類,因此是一種引用類型,也就是說,new一個類的實例時,實例的值保存在託管堆(managed heap)中,而類的實例在堆棧(stack)上存放的是該實例在託管堆(managed heap)中的地址。
  什麼是struct?
  struct是我們通常所說的結構(或結構體),它是一種值類型,用於將一組相關的變量組織爲一個單一的變量實體。所有的struct都繼承自System.ValueType類,因此是一種值類型,也就是說,struct實例在創建時分配在線程堆棧(stack)上,它本身存儲了具體的值。所以在使用struct時,我們可以將其當作int、char這樣的基本值類型類對待。

  從上面的理解可以看出,class和struct最本質的區別是:class是引用類型,而struct是值類型,它們在內存中的分配情況有所不同。以下具體指出它們的不同之處:

1、class是引用類型,struct是值類型
既然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的使用是一個對class實例的引用;而struct是直接使用它的值。例如:當我們將class作爲參數傳遞給一個方法,傳遞的是一個引用,而struct傳遞的是值。

4、struct不能有初始化器;而class可以有初始化器。
public struct structA
{
//public int A = 90; //錯誤:“structA.A”: 結構中不能有實例字段初始值
public int A;

}

public class classA
{
public int A = 90;
}

5、class可以有無參數構造器;但是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;
}
}

6、類使用前必須用new關鍵字實例化;struct不需要。

7、class支持繼承和多態;struct不支持,但struct可以和類一樣實現接口。

8、既然struct不支持繼承,其成員不能以protected或internal修飾。

9、class比較適合較大的和複雜的數據;struct適用於作爲經常使用的一些數據組合。

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