struct在C#中被用来定义结构,它是一种比类小的数据类型。和类一样都是创建对象的模板,可以有自己的数据以及处理和访问数据的方法。
struct的用法:
struct FurnitureSize { public double Height; public double Length { get; set; } public double Width; static FurnitureSize() { //nothing } public FurnitureSize(double paramLength, double paramWidth, double paramHeight = 2.2) { this.Height = paramHeight; this.Length = paramLength; this.Width = paramWidth; } public double Volume { get { return Height* Length* Width; } } public double Area() { return Volume/ Height; } }
从上边的代码片段中可以看出,struct和class几乎相同,那么struct和class除了关键字不同外,还有哪些不同呢?下面一一例举。
1.struct不能创建自己的无参构造函数(除了静态的无参构造函数)。而类则可以。
如果我给上边的FurnitureSize增加一个无参非静态构造函数的话就会被IntelliSense提示不能创建无参构造函数。
而类的话就可以创建自己的无参构造器(这样做没有意义),IntelliSense检查语法通过。
1 class ConstructorTest 2 { 3 public int int1; 4 public string str1; 5 public Boolean bool1; 6 //static ConstructorTest() { } 7 public ConstructorTest() 8 { 9 10 } 11 public ConstructorTest(int paramInt,string paramString,Boolean paramBoolean) 12 { 13 Console.WriteLine("Constructor opened."); 14 } 15 }
为什么会这样?这是因为.Net运行库实现的时候如果碰到是Class类型的时候,会先判断你是否重载了构造函数,如果重载了新的构造函数并且又没有声明无参构造函数的话,
你想创建一个这个类的实例就只能使用新的有参构造函数。比如如果我在class ConstructorTest里没有定义无参构造函数的话,我想创建ConstructorTest的实例只能使用
ConstructorTest dct = new ConstructorTest(1,"2",false);
而struct不一样,.Net运行库运行struct时,不管你定义多少个有参构造函数它都会执行一遍无参构造函数,即使你没有显示的定义有参构造函数。
2.在struct里不能在声明的时候赋初值,而类可以。
类给字段赋初值:语法检查通过。
因为运行struct的时候运行库无论如何都会跑一遍struct的无参构造器,而在无参构造器里会给字段赋初值,数值型默认为0,引用型初始化为null。即使在struct里提供了字段的初始值也不能绕过默认构造函数。所以在struct里不能为字段显式的赋初始值。
3.结构是值类型,类是引用类型
结构和其他简单类型一样被分配在栈中,所以在实例化struct对象或者给struct里的字段赋值得时候可以像下边这样。
1 FurnitureSize fs = new FurnitureSize(); 2 fs.Height = 2.2; 3 fs.Width = 1.8;
也可以像这样:
1 FurnitureSize fstmp; 2 fstmp.Height = 2.0; 3 fstmp.Width = 1.7;
而类的话只能先实例化对象,然后给对象的字段赋值。
1 ConstructorTest dct = new ConstructorTest(); 2 dct.int1 = 1;
像这样赋值是不对的:
4.除了Object,它不能继承别的结构。
结构的继承链:结构派生于System.ValueType--->System.Object。不能为结构提供其他基类,每个类都派生于ValueType。
struct适合用于小的数据结构,最好是它来定义简单类型的结合体。在为struct分配内存的时候速度非常快,在结构作用域消失的时候删除也非常快,因为它是一种值类型。当把struct作为参数传递给方法时,应该把它作为ref参数传递,以避免性能损失。