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對象的一切字段賦值
}
}