C#中的结构与类

对一一部分.NET开发人员来说,很不清楚什么时结构和类,以及他们有什么区别,适用于哪些场景。那么今天我就来带领大家来学习一下结构和类。

结构与类的区别

  1. 类型方面

结构是值类型,我们知道值类型是分配在堆栈上的,因此所有值类型都是结构类型,比如int是System.int32结构。通过结构可以创建更多的值类型。类是引用类型,引用类型是分配在堆上的 。堆栈的执行效率比堆的执行效率高很多,但是堆栈的资源是有限的,它并不适合处理大的复杂逻辑对象。因此结构能处理的是作为基类型对待的小对象,而类处理的是商业逻辑。由于结构是值类型的,所以结构之间的赋值可以创建新结构,而类是引用类型的,类之间的赋值只是复制引用(地址)。虽然结构与类的类型不一样,但它们的基类型都是object,C#中所有类型的基类型都是object。 虽然结构初始化也使用了new操作符,但结构对象依然分配在堆栈上而不是堆上,如果不使用new操作符,那么在初始化所有字段之前字段将保持未赋值状态,并且对象是不可用的。
2. 继承性方面
结构不能从另结构或者类继承,而且本身也不能被继承。结构没有sealed声明,但是结构是隐式的sealed。类可扩展,除非显示声明sealed,否则类可以继承其他类和接口,并且类自身也能被继承

Tip:结构能够继承接口,就像方法和类继承接口一样

  1. 内部结构方面

结构没有默认构造函数,但可以添加构造函数。另外,结构也没有析构函数,还没abstract和sealed声明。结构也不能有protected修饰符,并且可以不使用new操作符来初始化,但这里需要注意的是在结构中初始化实例字段是错误的

Tip:结构体中不能定义默认的、不带参数的构造函数,只能定义带参的构造函数

类有默认的构造函数,也有析构函数,并且还可以使用abstract和sealed声明,而且还有protected修饰符,并且必须使用new操作符来初始化。

Tip:可以定义默认的、不带参数的构造函数,或者带参的构造函数

结构应用场景

使用结构要注意以下条件:

  1. 表达的是一个单一值,比如int;
  2. 实例应大小低于16个字节;
  3. 不可改变。
  4. 不会被频繁装箱。

只有满足上面四条的条件才能使用结构。但是呢使用结构也要注意以下这几个问题:

  1. 一般情况下应该使用class而不是struct。除非程序需要考虑性能才考虑使用struct;
  2. 定义struct时应该尽量作为私有类型或内部类型,不要公开它;
  3. struct属性尽量不要定义公开的set,也就是不可改变;
  4. 使用struct管理非托管资源时应定义Free方法,在使用的时候要在恰当时机调用它。不要去实现IDisposable接口;
  5. 在迫不得已需要调用本地代码的情况下才可无视选用struct。