C#Struct使用技巧?
我喜欢使用结构。
因此,在阅读本文后 ,我是否应该反对使用它们?
也可以看看:
- 我什么时候应该使用结构而不是类?
- 何时在C#中使用struct?
您应该对结构进行以下考虑:
- 结构应该是不可变的(可变结构不直观且不可预测)
- 结构总是有一个无法更改的默认(公共无参数)构造函数
- struct size不应超过16个字节
- 应该重写
Equals
和GetHashCode
方法以获得更好的性能 - 建议实现
IEquatable
接口 - 还建议重新定义和
==
以及!=
运算符
我几乎从不定义自定义结构。 IMO并没有那么多自然价值类型。
特别是,在定义一个可变结构之前,我会非常非常仔细地考虑,特别是如果它通过接口实现进行变异。 可变结构的行为方式是人们根本没想到的,导致代码难以理解。
我认为值得阅读“ 开发类库的设计指南 ”中的“ 在类和结构之间进行选择 ” 。
特别是:
除非类型具有以下所有特征,否则不要定义结构:
它逻辑上表示单个值,类似于基本类型(整数,双精度等)。
它的实例大小小于16个字节。
这是不可改变的。
它不必经常装箱。
你真的经常开发具有所有这些特征的类型吗?
它们不像类那样适合面向对象的编程范例。 它们适用于小型数据结构,但除此之外我还使用类。
我认为结构的主要目的 – 只保留变量类型。 如果你把一些类保留在struct中 – 你错了。
问自己以下关于使用结构建模的数据集的问题:
- 它可能需要任何获取/设置逻辑吗?
- 可能需要存储任何数据特有的逻辑吗?
- 可能需要inheritance另一组数据吗?
- 可能另一组数据需要inheritance这一个吗?
我想如果你能对所有这些问题尽心尽力地回答“不”,那么没有充分的理由不使用结构。 我认为人们在某些结构非常好的情况下会使用静态子类。
类比结构更容易实现。 如果您错误地实现了结构,它可能会给您一些意外错误。
结构不应大于16个字节,否则会失去大部分性能优势。
结构旨在成为值类型,表示某种类型的单个实体。
结构应该是不可变的。 这意味着您永远不会更改结构中的某个属性。 如果您想要一个不同的struct值,则创建一个新值。
结构的使用应限于当您真正需要的只是一个小型数据结构时。 (正如你所读)。 我只会将它们用于最小的数据结构,如坐标,偏移,有时用于图形。
在许多方面,您可以将C#中的结构视为缩小类。 它们基本上与类相同,但更多的设计用于您只想将一些数据组合在一起的情况。 它们在以下方面与课程不同: 要记住一些事项
- 结构是值类型,而不是引用类型。 这意味着它们存储在堆栈中或内联(如果它们是存储在堆上的另一个对象的一部分)并且具有与简单数据类型相同的生命周期限制。
- 结构不支持inheritance。
- 构造函数在结构体中的工作方式存在一些差异。 特别是,编译器始终提供默认的无参数构造函数,您不允许替换它。