C#結構體和類的區別
類和結構是 .NET Framework 中的常規類型系統的兩種基本構造.
值類型與引用類型
結構
結構是值類型,值類型在堆棧上分配地址,所有的基類型都是結構類型,例如:int 對應System.int32 結構,string 對應 system.string 結構 ,通過使用結構可以創建更多的值類型。
類
類是引用類型,引用類型在堆(程序的局部變量存在於(堆棧)中,全局變量存在於(靜態區 )中,動態申請數據存在於( 堆)中。)上分配地址。
堆棧的執行效率要比堆的執行效率高,可是堆棧的資源有限,不適合處理大的邏輯複雜的對象。所以結構處理作爲基類型對待的小對象,而類處理某個商業邏輯。
因爲結構是值類型所以結構之間的賦值可以創建新的結構,而類是引用類型,類之間的賦值只是複製引用。
結構的特點:
結構與類共享大多數相同的語法,但結構比類受到的限制更多:
在結構聲明中,除非字段被聲明爲 const或 static,否則無法初始化。
結構不能聲明默認構造函數(沒有參數的構造函數)或析構函數。
結構在賦值時進行復制。 將結構賦值給新變量時,將複製所有數據,並且對新副本所做的任何修改不會更改原始副本的數據。在使用值類型的集合(如 Dictionary<string, myStruct>)時,請務必記住這一點。
結構是值類型,而類是引用類型。
與類不同,結構的實例化可以不使用 new 運算符。
using System;
public struct CoOrds
{
public int x, y;
public CoOrds(int p1, int p2)
{
this.x = p1;
this.y = p2;
}
publicvoid Show()
{
}
}
class TestCoOrdsNoNew
{
static void Main()
{
// Declare an object:
CoOrds coords1;//如果是類必須new出結構體可以不new 但是字段必須是public
// Initialize:
coords1.x = 10;
coords1.y = 20;
// Display results:
Console.Write("CoOrds 1: ");
Console.WriteLine("x = {0}, y = {1}", coords1.x, coords1.y);
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
結構可以聲明帶參數的構造函數。
一個結構不能從另一個結構或類繼承,而且不能作爲一個類的基。 所有結構都直接繼承自System.ValueType,後者繼承自System.Object。
結構可以實現接口。
interfaceIImage
{
void Paint();
}
struct Picture : IImage
{
public void Paint()
{
// painting code goes here
}
private int x, y, z;
// other struct members
}
結構可用作可以爲 null 的類型,因而可向其賦 null 值。
總的來說,實際上適合用 struct 的範圍是比較侷限的,以下可以考慮使用:
行爲與基元類型一樣。
具有 16 字節以下的實例大小。
是不可改變的。
值語義是合意的。