C#Struct使用技巧?

我喜欢使用结构。

因此,在阅读本文后 ,我是否应该反对使用它们?

也可以看看:

  • 我什么时候应该使用结构而不是类?
  • 何时在C#中使用struct?

您应该对结构进行以下考虑:

  • 结构应该是不可变的(可变结构不直观且不可预测)
  • 结构总是有一个无法更改的默认(公共无参数)构造函数
  • struct size不应超过16个字节
  • 应该重写EqualsGetHashCode方法以获得更好的性能
  • 建议实现IEquatable接口
  • 还建议重新定义和==以及!=运算符

我几乎从不定义自定义结构。 IMO并没有那么多自然价值类型。

特别是,在定义一个可变结构之前,我会非常非常仔细地考虑,特别是如果它通过接口实现进行变异。 可变结构的行为方式是人们根本没想到的,导致代码难以理解。

我认为值得阅读“ 开发类库的设计指南 ”中的“ 在类和结构之间进行选择 ” 。

特别是:

除非类型具有以下所有特征,否则不要定义结构:

  • 它逻辑上表示单个值,类似于基本类型(整数,双精度等)。

  • 它的实例大小小于16个字节。

  • 这是不可改变的。

  • 它不必经常装箱。

你真的经常开发具有所有这些特征的类型吗?

它们不像类那样适合面向对象的编程范例。 它们适用于小型数据结构,但除此之外我还使用类。

我认为结构的主要目的 – 只保留变量类型。 如果你把一些类保留在struct中 – 你错了。

问自己以下关于使用结构建模的数据集的问题:

  • 它可能需要任何获取/设置逻辑吗?
  • 可能需要存储任何数据特有的逻辑吗?
  • 可能需要inheritance另一组数据吗?
  • 可能另一组数据需要inheritance这一个吗?

我想如果你能对所有这些问题尽心尽力地回答“不”,那么没有充分的理由不使用结构。 我认为人们在某些结构非常好的情况下会使用静态子类。

类比结构更容易实现。 如果您错误地实现了结构,它可能会给您一些意外错误。

结构不应大于16个字节,否则会失去大部分性能优势。

结构旨在成为值类型,表示某种类型的单个实体。

结构应该是不可变的。 这意味着您永远不会更改结构中的某个属性。 如果您想要一个不同的struct值,则创建一个新值。

结构的使用应限于当您真正需要的只是一个小型数据结构时。 (正如你所读)。 我只会将它们用于最小的数据结构,如坐标,偏移,有时用于图形。

在许多方面,您可以将C#中的结构视为缩小类。 它们基本上与类相同,但更多的设计用于您只想将一些数据组合在一起的情况。 它们在以下方面与课程不同: 要记住一些事项

  • 结构是值类型,而不是引用类型。 这意味着它们存储在堆栈中或内联(如果它们是存储在堆上的另一个对象的一部分)并且具有与简单数据类型相同的生命周期限制。
  • 结构不支持inheritance。
  • 构造函数在结构体中的工作方式存在一些差异。 特别是,编译器始终提供默认的无参数构造函数,您不允许替换它。