浅谈C#中的结构
结构与类很相似,都表示可以包含数据成员和函数成员的数据结构。但是,与类不同,结构是一种值类型,并且不需要堆分配。结构类型的变量直接包含结构的数据,而类类型的变量包含对数据的引用。
结构对于具有值语义的小的数据结构特别有用。复数、坐标系中的点或字典中的“键-值”对都是结构的典型示例。这些数据结构的关键之处在于:它们只有少量数据成员,它们不要求使用继承或引用标识,而且它们适合使用值语义(赋值时直接复制值而不是复制它的引用)方便地实现。。
结构声明
结构声明是一种用于声明新结构的类型声明: 使用struct关键字
访问修辞符 struct 结构名
{
数据成员
成员函数
}
类和结构的区别
结构在以下几个重要方面和类是不同的:
• 结构是值类型,类是引用类型。
• 在结构中,实例字段声明中不能含有变量初始值设定项。
• 在结构中不能声明无参数的实例构造函数。
• 在结构中不能声明析构函数。
• 在结构中不存在继承。一个结构不能从另一个结构或类继承,而且不能作为一个类的基类。结构可实现接口,而且实现方式与类实现接口的方式完全相同。
示例 1
本示例声明一个结构,它有5个成员:2个属性、1个方法和2个私有字段。本示例创建该结构的一个实例,并将其投入使用:
using System;
struct Point
{
private int x,y;
public int X
{
get
{
return x;
}
set
{
x=value;
}
}
public int Y
{
get
{
return y;
}
set
{
y=value;
}
}
public void DisplayPoint()
{
Console.WriteLine("The Point'x value is: {0}", x);
Console.WriteLine("The Point'y value is: {0}",y);
}
}
class TestClass
{
public static void Main()
{
Point p = new Point();
p.X = 5;
p.Y=5;
p.DisplayPoint();
}
}
以上new 运算符创建结构的实例,但结构是值类型,并没有在堆上为实例分内存空间.结构变量本身就存储了该实例的值.而不是实例的引用。new运算符只不过是调用了结构的构造函数。
示例 2
本示例展示当向方法传递结构时,将传递该结构的副本,而传递类实例时,将传递一个引用。
using System;
struct STPointX
{
private int x;
public int X
{
get
{
return x;
}
set
{
x=value;
}
}
}
class CLPointX
{
private int x;
public int X
{
get
{
return x;
}
set
{
x=value;
}
}
}
class TestClass
{
public static void structP(STPointX s)
{
s.X = 5;
}
public static void classP(CLPointX c)
{
c.X = 5;
}
public static void Main()
{
STPointX a = new STPointX() ;
CLPointX b = new CLPointX();
a.X = 1;
b.X = 1;
structP(a); //传递实例的副本
classP(b); //传递实例的引用
Console.WriteLine("a.x = {0}", a.X);
Console.WriteLine("b.x = {0}", b.X);
}
}