標籤:編程 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的區別