结构与类很相似,都表示可以包含数据成员和函数成员的数据结构。但是,与类不同,结构是一种值类型,并且不需要堆分配。结构类型的变量直接包含结构的数据,而类类型的变量包含对数据的引用。
结构对于具有值语义的小的数据结构特别有用。复数、坐标系中的点或字典中的“键-值”对都是结构的典型示例。这些数据结构的关键之处在于:它们只有少量数据成员,它们不要求使用继承或引用标识,而且它们适合使用值语义(赋值时直接复制值而不是复制它的引用)方便地实现。。结构声明结构声明是一种用于声明新结构的类型声明: 使用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); }}