首页 > 代码库 > 类与结构那点事
类与结构那点事
有时候总是分不清类和结构,在什么时候用类?在什么时候用结构?
- 按值区分
类,引用类型
结构,值类型
- 定义方式
类:字段(除了const字段之外)应总是私有的,并 由公有属性封装;
1 ResponseCassetteCounter cassetteCounter = new ResponseCassetteCounter();
结构:结构即可以像类一样用过new运算符,但并未为结构分配堆中的内存;声明后还可以直接对字段赋值; 编译器总是提供一个无参数的默认构造函数,它是不允许替换的;结构不支持实现继承,但支持接口继承;
1 Dimensions point = new Dimensions();2 point.Length = 3;3 point.width = 6;
1 Dimensions point;2 point.Length = 3;3 point.Width = 6;
如果类用第二种方式定义的话会产生编译错误, 因为point包含一个未初始化的引用;
- 性能
类存储在堆中,通过这种方式可以在数据的生存期上获得很大的灵活性,但性能会有一定的损失,因为托管堆的优化,这种性能损失比较小;有时仅需要一个小的数据结构。 此时,类提供的功能多于我们需要的功能,由于性能
原因,最好使用结构。对于分配内存来说,结构是要比类快的,但是把结构作为参数来传递或者把一个结构赋予另一个结构(如A=B,其中A和B是结构),结构的所有内容就被复制,而对于类,则只复制引用 。 这
样就会有性能损失,根据结构的大小,性能损失也不同;
当把结构作为参数传递给方法时,应 把它作为ref参数传递,以避免性能损失;此时只传递了结构在内存中的地址,这样传递速度就与在类中的传递速度工样快了;
- 构造函数
禁止在C#的结构内使用无参数的构造函数,默认构造函数把数值字段都初始化为0,把引用类型字段初始化为null,且总是隐式地给出,即使提供了其他带参数的构造函数,也是如此。提供字段的初始值也不能绕过默认构造
函数,例如下面的代码编译时不能通过的
1 struct Dimensions2 {3 pub1ic double Length = 1; // error. Initial values not allowed4 pub1ic double Width = 2;// error. Initial values not allowed5 }
当然,如果Dimensions声明为一个类,这段代码就不会有编译错误;
类与结构那点事