日期:2010-01-02 浏览次数:20490 次
结构是使用 struct关键字定义的,与类相似,都表示可以包含数据成员和函数成员的数据结构。
一般情况下,我们很少使用结构,而且很多人也并不建议使用结构,但作为.NET Framework 一般型別系统中的一个基本架构,还是有必要了解一下的。
结构的特征:
结构是一种值类型,并且不需要堆分配。结构的实例化可以不使用new运算符。
在结构声明中,除非字段被声明为 const 或 static,否则无法初始化。结构类型永远不是抽象的,并且始终是隐式密封的,因此在结构声明中不允许使用abstract和sealed修饰符。
结构不能声明默认构造函数(没有参数的构造函数)或析构函数,但可以声明带参数的构造函数。结构可以实现接口,但不能从另一个结构或类继承,而且不能作为一个类的基,所有结构都直接继承自 System.ValueType,后者继承自 System.Object。结构在赋值时进行复制。将结构赋值给新变量时,将复制所有数据,并且对新副本所做的任何修改不会更改原始副本的数据。在使用值类型的集合(如 Dictionary<string, myStruct>)时,请务必记住这一点。结构类型的变量直接包含了该结构的数据,而类类型的变量所包含的只是对相应数据的一个引用(被引用的数据称为“对象”)。但是结构仍可以通过ref和out参数引用方式传递给函数成员。结构可用作可以为 null 的类型,因而可向其赋 null 值。structA
{publicintx; //不能直接对其进行赋值publicinty;
public static stringstr = null; //静态变量可以初始化publicA(intx,inty) //带参数的构造函数
{this.x =x;this.y =y;
Console.WriteLine("x={0},y={1},str={2}", x, y,str);
}
}classProgram
{staticvoidMain(string[] args)
{
A a =newA(1,2);
A a1 =a;
a.x =10;
Console.WriteLine("a1.x={0}",a1.x);
Console.Read();
}
}
结果为:x=1,y=2,str=
a1.x=1
此时a1.x值为1是因为,将a赋值给a1是对值进行复制,因此,a1不会受到a.x赋值得改变而改变。
但如果A是类,这时a和a1里的x引用的是同一个地址,则a1.x的值会输出10。
结构的装箱与拆箱我们知道,一个类类型的值可以转换为object类型或由该类实现的接口类型,这只需在编译时把对应的引用当作另一个类型处理即可。
与此类似,一个object类型的值或者接口类型的值也可以被转换回类类型而不必更改相应的引用。当然,在这种情况下,需要进行运行时类型检查。由于结构不是引用类型,上述操作对结构类型是以不同的方式实现的。
当结构类型的值被转换为object类型或由该结构实现的接口类型时,就会执行一次装箱操作。
反之,当 object类型的值或接口类型的值被转换回结构类型时,会执行一次拆箱操作。
与对类类型进行的相同操作相比,主要区别在于:
装箱操作会把相关的结构值复制为已被装箱的实例,而拆箱则会从已被装箱的实例中复制出一个结构值。
因此,在装箱或拆箱操作后,对“箱”外的结构进行的更改不会影响已被装箱的结构。structProgram
{staticvoidMain(string[] args)
{inti =1;objecto =i; //隐式装箱