struct是值類型,隱式繼承自System.ValueType,struct實例被分配在堆棧上,由系統內存回收;class是引用類型,class的實例被分配在托管堆上,由GC回收。
struct不可以有無參構造函數,只能有帶參構造函數;class當然可以有無參構造函數。
struct和class都可以通過new關鍵字創建實例。
struct不能用abstract修飾,可以在class前面加abstract關鍵字。
struct作為參數傳遞時,傳遞的是值,而class傳遞的是引用地址。
來看一個struct和class類型作為參數傳遞的例子。
class Program{static void Main(string[] args){PointStruct structPoint = new PointStruct();structPoint.x = 10;structPoint.y = 10;Console.WriteLine("struct的初始值是:x={0},y={1}",structPoint.x, structPoint.y);ChangeStructPoint(structPoint);Console.WriteLine("struct的初始值改變後是:x={0},y={1}", structPoint.x, structPoint.y);Console.WriteLine();PointClass pointClass = new PointClass(10, 10);Console.WriteLine("class的初始值是:x={0},y={1}", pointClass.x, pointClass.y);ChangeClassPoint(pointClass);Console.WriteLine("class的初始值改變後是:x={0},y={1}", pointClass.x, pointClass.y);Console.ReadKey();}static void ChangeStructPoint(PointStruct pointStruct){pointStruct.x = 20;pointStruct.y = 20;Console.WriteLine("正在改變struct的值是:x={0},y={1}", pointStruct.x, pointStruct.y);}static void ChangeClassPoint(PointClass pointClass){pointClass.x = 20;pointClass.y = 20;Console.WriteLine("正在改變class的值是:x={0},y={1}", pointClass.x, pointClass.y);}}public struct PointStruct{public int x;public int y;public PointStruct(int x, int y){this.x = x;this.y = y;}}public class PointClass{public int x;public int y;public PointClass(int x, int y){this.x = x;this.y = y;}}
結果是:
以上, struct和class的結構相似,當struct實例作為方法參數傳遞時,在堆棧上拷貝了一份傳遞給方法,在方法內改變其值,改變的是另一份struct實例的值;而class實例作為參數傳遞時,在堆棧上拷貝了一份傳遞給方法,堆棧上的2個實例指向同一個引用地址,改變托管堆上實例的值,也就相當於同時改變了堆棧上2個class實例的值。
總結:class完全可以替代struct能實現的所有功能,但,對於一些相對小的數據結構,應該考慮使用struct。