写点什么

C#中的结构与类

作者:喵叔
  • 2021 年 12 月 13 日
  • 本文字数:1026 字

    阅读完需:约 3 分钟

对一一部分.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。

用户头像

喵叔

关注

还未添加个人签名 2020.01.14 加入

还未添加个人简介

评论

发布
暂无评论
C#中的结构与类