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
文章列表