结构 是可以包含数据成员和函数成员的数据结构,这一点和类一样;下面我们讲一下结构与类不同的地方:
1. 结构体是值类型,无需进行堆分配,类是引用类型
2. 结构类型的变量直接存储数据结构,而类类型的变量存储对动态分配的对象的引用
3. 类支持继承,结构体不支持继承
4. 关键字简单说下,类是Class,结构体是Struct
下面我们通过代码片段来具体看一下结构体:
/// <summary>
/// Point类
/// </summary>
public class Point
{
public int x, y;
public Point(int x,int y)
{
this. x=x;
this. y=y;
}
}
/// <summary>
/// 结构体Point
/// </summary>
public struct Point
{
public int x, y;
public Point(int x,int y)
{
this. x=x;
this. y=y;
}
}
借助类,两个变量可以引用同一个对象,因此,对一个变量执行的运算可以会影响到另一个变量的引用。
借助结构体,每个变量都有自己的数据副本,因此,对一个变量执行的运算不会影响到两一个变量。
下面我们在看一下分别调用类Point和结构Point,输出的结果有什么不同:
public class PointExample
{
public static void Main ( )
{
Point a = new Point ( 10 , 10 );// Point的类型是Class
Point b = a;
a. x=20;
Console. WriteLine ( b. x );//OutPuts "20"
}
public class PointExample
{
public static void Main ( )
{
Point a = new Point ( 10 , 10 );//Point的类型是Struct
Point b = a;
a. x=20;
Console. WriteLine ( b. x );//OutPuts "10"
}
}
通过这个代码片段可以看出来,如果Point是类,则输出20,因为a和b引用同一对象。
如果Point是结构,则输出10,因为将a赋值给b创建了新的副本,因此副本不受后面a.x的赋值的影响
总结一下吧:首先,复制整个结构通常比复制对象引用效率更低,因此通过结构进行的赋值和值参数传递可能比引用类型的成本更高。
其次,除in、ref和out参数以外,无法创建对结构的引用,这就表示在很多场景中都不能使用结构。