C#中的结构函数
假设有一个类:布局
class Dimensions性能
{this
public double Length;spa
public double Width;设计
}对象
定义了一个类,它只存储某一项的长度和宽度.嘉定编写一个布置家居的程序,让人们试着在计算机上从新布置家具,并存储每件家具的维度.使字段变为共有字段,就会违背变成规则,但咱们实际上并不须要类的所有功能.如今只有两个数字,把他们当作一堆来处理,要比单个处理方便一些.既不须要不少方法,也不须要从类中继承,也不但愿.NET运行库在堆中遇到麻烦和性能问题,值存储两个double类型的数据便可.继承
为此,只须要修改代码,使用关键字struct代替class,定义一个结构而不是类接口
struct Dimensions内存
{
public double Length;
public double Width;
}
为结构定义函数与味蕾定义函数彻底相同.
struct Dimensions
{
public double Length;
public double Width;
public Dimensions(double length, double width)
{
this.Length = length;
this.Width = width;
}
public double Diagonal
{
get
{
return Math.Sqrt(Length * Length + Width * Width);
}
}
}
结构是值类型,不是引用类型.他们存储在栈中或存储为内联,其生存期的限制与简单的数据类型同样.
结构不支持继承.
对于结构构造函数的工做方式有一些区别.尤为是编译器老是提供一个无参数的默认构造函数,他是不容许替换的.
使用结构,能够指定字段如何在内存中的布局.
由于结构其实是把数据项组合在一块儿,有时大多数或者所有的字段都声明为public.严格来讲,这是违背.NET代码的规则的,根据Microsoft,字段(除了const字段以外)应该老是私有的,并由共有属性封装.可是对于简单的结构,共有字段仍是能够接受的.
结构是值类型
虽然结构是值类型,可是在语法上经常能够把他们当作类来处理.例如,上面的Dimension类的定义中,能够编写下面的代码:
Dimensions point = new Dimensions();
point.Lenth=3;
point.Width=6;
注意,由于结构是值类型,因此new运算符与类和其余引用类型的工做方式不一样.new运算符并不分配队中的内存,而是只调用相应的构造函数,根据传送给他的参数,初始化全部的字段.对于结构,能够编写下面代码:
Dimensions point;
point.Length=3;
point.Width=6;
若是Dimensions是一个类,就会产生错误,由于point包含一个为初始化的引用----不知想任何地方的一个地址,因此不能给其字段设置值.可是对于结构,变量声明其实是维护整个结构在栈中分配空间,因此就能够为他赋值了.
可是若是这样:
Dimensions point;
double d=point.Length;
编译器就会产生一个错误,缘由是使用了未初始化的变量.
结构遵循其余数据类型都遵循的规则:在使用前全部的元素都必须进行初始化.在结构上调用new运算符,或者给全部的字段分别赋值,结构就彻底初始化了.若是结构定义为类的成员字段,在初始化包含的对象时,该结构会自动初始化为0.
结构是会影响性能的值类型.
结构不失为继承设计的.这意味着:他不能从一个结构中继承.惟一的例外是对应的结构(和C#中的其余类型同样)最终派生于类System.Object.所以结构能够访问System.Object的方法.在结构中,甚至能够重写System.Objetc中的方法----如重写ToString()方法.结构的继承链是:每一个结构派生自System.ValueType类,System.ValueType类又派生自System.Object.ValueType并无给Object添加任何新成员,但提供了一些更适合结构的额实现方式.注意,不能为结构提供其余类:每一个结构都派生自ValueType.
结构的构造函数
为结构定义构造函数的方式与为类定义构造函数的方式相同,但不容许定义无参数的构造函数.禁止在C#的结构内使用无参数的构造函数.
前面说过,默认构造函数把数值字段都初始化为0,把引用类型字段初始化为null,且老是隐式的给出,及时提供了其余带参数的构造函数,也是如此,提供字段的初始值也不鞥呢绕过默认构造函数.
例如:
struct Dimensions
{
public double Length=1;
public double Width=2;
}
会出现错误,结构中不能有实例字段初始值设定项,若是是类就不会出现这个错误.
另外,能够向类那样为结构提供Close()或Dispose()方法.
struct总结:struct 类型适于表示 Point、Rectangle 和 Color 等轻量对象。为结构定义默认(无参数)构造函数是错误的。 在结构体中初始化实例字段也是错误的。 只能经过两种方式初始化结构成员:一是使用参数化构造函数,二是在声明结构后分别访问成员。 对于任何私有成员或以其余方式设置为不可访问的成员,只能在构造函数中进行初始化。
若是使用 new 运算符建立结构对象,则会建立该结构对象,并调用适当的构造函数。 与类不一样,结构的实例化能够不使用 new 运算符。 在此状况下不存在构造函数调用,于是能够提升分配效率。 可是,在初始化全部字段以前,字段将保持未赋值状态且对象不可用。
当结构包含引用类型做为成员时,必须显式调用该成员的默认构造函数,不然该成员将保持未赋值状态且该结构不可用。 (这将致使编译器错误 CS0171。)
对于结构,不像类那样存在继承。 一个结构不能从另外一个结构或类继承,并且不能做为一个类的基。 可是,结构从基类 Object 继承。 结构可实现接口,其方式同类彻底同样。
没法使用 struct 关键字声明类。 在 C# 中,类与结构在语义上是不一样的。 结构是值类型,而类是引用类型。