对一一部分.NET开发人员来说,很不清楚什么时结构和类,以及他们有什么区别,适用于哪些场景。那么今天我就来带领大家来学习一下结构和类。
结构与类的区别
1.类型方面
结构是值类型,我们知道值类型是分配在堆栈上的,因此所有值类型都是结构类型,比如int是System.int32结构。通过结构可以创建更多的值类型。类是引用类型,引用类型是分配在堆上的 。堆栈的执行效率比堆的执行效率高很多,但是堆栈的资源是有限的,它并不适合处理大的复杂逻辑对象。因此结构能处理的是作为基类型对待的小对象,而类处理的是商业逻辑。由于结构是值类型的,所以结构之间的赋值可以创建新结构,而类是引用类型的,类之间的赋值只是复制引用(地址)。虽然结构与类的类型不一样,但它们的基类型都是object,C#中所有类型的基类型都是object。 虽然结构初始化也使用了new操作符,但结构对象依然分配在堆栈上而不是堆上,如果不使用new操作符,那么在初始化所有字段之前字段将保持未赋值状态,并且对象是不可用的。
2.继承性方面
结构不能从另结构或者类继承,而且本身也不能被继承。结构没有sealed声明,但是结构是隐式的sealed。类可扩展,除非显示声明sealed,否则类可以继承其他类和接口,并且类自身也能被继承
Tip:结构能够继承接口,就像方法和类继承接口一样
4.内部结构方面
结构没有默认构造函数,但可以添加构造函数。另外,结构也没有析构函数,还没abstract和sealed声明。结构也不能有protected修饰符,并且可以不使用new操作符来初始化,但这里需要注意的是在结构中初始化实例字段是错误的
Tip:结构体中不能定义默认的、不带参数的构造函数,只能定义带参的构造函数
类有默认的构造函数,也有析构函数,并且还可以使用abstract和sealed声明,而且还有protected修饰符,并且必须使用new操作符来初始化。
Tip:可以定义默认的、不带参数的构造函数,或者带参的构造函数
结构应用场景
使用结构要注意以下条件:
- 表达的是一个单一值,比如int;
- 实例应大小低于16个字节;
- 不可改变。
- 不会被频繁装箱。
只有满足上面四条的条件才能使用结构。但是呢使用结构也要注意以下这几个问题:
- 一般情况下应该使用class而不是struct。除非程序需要考虑性能才考虑使用struct;
- 定义struct时应该尽量作为私有类型或内部类型,不要公开它;
- struct属性尽量不要定义公开的set,也就是不可改变;
- 使用struct管理非托管资源时应定义Free方法,在使用的时候要在恰当时机调用它。不要去实现IDisposable接口;
- 在迫不得已需要调用本地代码的情况下才可无视选用struct。