C# struct 性能损失
虽然结构是值类型,但在语法上常常可以把它们当作类来处理。例如,在上面的 Dimensions 类
的定义中,可以编写下面的代码:
Dimensions point = new Dimensions();
point.Length = 3;
point.Width = 6;
注意,因为结构是值类型,所以new 运算符与类和其他引用类型的工作方式不同。new 运算符并
不分配堆中的内存,而是调用相应的构造函数,根据传送给它的参数,初始化所有的字段。对于结构,
可以编写下述代码:
Dimensions point;
point.Length = 3;
point.Width = 6;
如果Dimensions 是一个类,就会产生一个编译错误,因为point 包含一个未初始化的引用--不指
向任何地方的一个地址,所以不能给其字段设置值。但对于结构,变量声明实际上是为整个结构分配
堆栈中的空间,所以就可以赋值了。但要注意下面的代码会产生一个编译错误,编译器会抱怨用户使
用了未初始化的变量:
Dimensions point;
Double D = point.Length;
结构遵循其他数据类型都遵循的规则:在使用前所有的元素都必须进行初始化。在结构上调用
new 运算符,或者给所有的字段分别赋值,结构就完全初始化了。当然,如果结构定义为类的成员字
段,在初始化包含对象时,该结构会自动初始化为0。
结构是值类型,所以会影响性能,但根据使用结构的方式,这种影响可能是正面的,也可能是负
面的。正面的影响是为结构分配内存时,速度非常快,因为它们将内联或者保存在堆栈中。
在结构超出了作用域被删除时,速度也很快。另一方面,只要把结构作为参数来传递或者把一个结构
赋给另一个结构(例如A=B,其中A 和B 是结构),结构的所有内容就被复制,而对于类,则只复制
引用。这样,就会有性能损失,根据结构的大小,性能损失也不同。注意,结构主要用于小的数据结
构。但当把结构作为参数传递给方法时,就应把它作为ref 参数传递,以避免性能损失--此时只传递
了结构在内存中的地址,这样传递速度就与在类中的传递速度一样快了。另一方面,如果这样做,就
必须注意被调用的方法可以改变结构的值。