C#基本語法:構造和類差別詳解。本站提示廣大學習愛好者:(C#基本語法:構造和類差別詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C#基本語法:構造和類差別詳解正文
構造和類很類似,也能夠包括數據成員和函數成員,然則與類分歧,構造是一種值類型,(我們可以懂得為一種特別的值類型所以不存在繼續的成績)為其分派數據不須要從托管堆平分配存儲器。構造類型的變量直接包括了該構造的數據,而類類型的變量所包括的只是對響應對象的一個援用。
上面總結一下構造和類的分歧:
1.構造是值類型,對構造類型的變量賦值將創立所賦值的一個正本。
2.構造實例的默許值不是null,而是具有默許值的初始值。
3.在構造和類中this的意義紛歧樣。
4.構造不支撐繼續(所以構造成員的聲明可拜訪性不克不及是protected,protected internal,構造中的函數成員不克不及是abstract 或許virtual,所以在構造中override潤飾符只實用於重寫從System.ValueType繼續的辦法)然則可以完成接口。
5.在構造中實例字段聲明中不克不及含有變量的初始值設定項
6.在構造中不克不及聲明無參數的實例結構函數。
7.在構造中不克不及聲明析構函數。
測試差別特征代碼:
using System; namespace StructAndClass { struct SPoint { public int x, y; public SPoint(int x, int y) { this.x = x; this.y = y; } } class CPoint { public int x, y; public CPoint(int x, int y) { this.x = x; this.y = y; } } class Test { public static void Main() { SPoint sp1 = new SPoint(2, 5); Console.WriteLine("構造/sp1初始值:"); Console.WriteLine("sp1.x={0}", sp1.x); SPoint sp2 = sp1; Console.WriteLine("sp1=sp2後:"); Console.WriteLine("sp1.x={0}"); Console.WriteLine("sp1.x={0}", sp1.x); Console.WriteLine("sp2.x={0}", sp2.x); sp1.x = 5; Console.WriteLine("再次轉變sp1的值後:"); Console.WriteLine("sp1.x={0}", sp1.x); Console.WriteLine("sp2.x={0}", sp2.x); Console.WriteLine("============================"); CPoint cp1 = new CPoint(2,5); Console.WriteLine("類/cp1初始值:"); Console.WriteLine("cp1.x={0}", cp1.x); CPoint cp2 = cp1; Console.WriteLine("cp1=cp2後:"); Console.WriteLine("cp1.x={0}", cp1.x); Console.WriteLine("cp2.x={0}", cp2.x); cp1.x = 5; Console.WriteLine("再次轉變cp1的值後:"); Console.WriteLine("cp1.x={0}", cp1.x); Console.WriteLine("cp2.x={0}", cp2.x); Console.ReadKey(); } } }
關於構造,即便沒有new運算符聲明的構造變量也是有用的,構造固然不克不及聲明無參數的實力結構函數,然則它其實隱式的包括了一個無參數的結構函數:並且在構造的一切字段沒有明白賦值之前,不克不及挪用構造的實例函數成員。在構造的結構函數中應當給一切的字段賦值。例如:
struct DC { public int x, y; public int X { set { x = value; } get { return x; } } public int Y { set { y = value; } get { return y; } } public DC(int x,int y) { this.x = x; this.y = y; } } struct RDC { public int x, y; public int X { set { x = value; } get { return x; } } public int Y { set { y = value; } get { return y; } } public RDC(int x, int y) { this.x = x; this.y = y; } } class Test { public static void Main() { DC dc=new DC(); dc.x = 3; dc.y = 5; Console.WriteLine("曾經對x,y初始化後:"); Console.WriteLine("此時可以拜訪和修正dc.X={0}的值",dc.X); Console.WriteLine("我在這裡創立了一個DC的復制構造RDC/n而且纰謬x,y初始化就會報錯"); RDC rdc; rdc.y = 5;//可以編譯經由過程 rdc.X = 3;//這裡就會失足,不克不及編譯經由過程 Console.WriteLine("=======test over================"); } }
在構造的實例結構函數內,this 相當於一個構造類型的 out 參數,(必需在外部對它明白賦值)而在構造的實例函數成員內,this 相當於一個構造類型的 ref 參數。在這兩種情形下,this 自己相當於一個變量,因此有能夠對該函數成員挪用所觸及的全部構造停止修正(如對 this 賦值,或許將 this 作為 ref 或 out 參數傳遞)。例如:(援用下面的例子)
struct DC { public int x, y; public int X { set { x = value; } get { return x; } } public int Y { set { y = value; } get { return y; } } public DC(int x,int y) { X= x;//這裡就是錯的 Y = y;//會提醒沒有給this對象的一切字段賦值 } }