C#中Struct與Class的區別
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的區別