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