我应该使用Struct吗?

时间:2010-10-26 09:08:24

标签: c# struct

  

可能重复:
  When to use struct in C#?

嗨,我正在创建一个在C#中有一个纯粹用于保存变量的类的应用程序,除了设置和获取这些变量之外别无其他。我想知道,为了提高效率和良好的编码实践,我是否应该将此类转换为结构,以便正确使用它。我之前从未使用过结构但是一直在研究它们但是我在使用它时遇到了一些麻烦。任何建议将不胜感激!

谢谢, 斯图尔特

7 个答案:

答案 0 :(得分:6)

如果值集合模拟值类型(即,没有自己的标识的东西,并且具有相同值的两个实例被视为相同)使用结构。

否则,请使用课程。

答案 1 :(得分:0)

使用结构代替类取决于您正在使用的场景。虽然您可以使用结构代替类,但结构缺乏实现访问标识符的能力(例如Private,Public,Protected)。如果您只使用类来保存变量,也可以使用结构,但如果您的类包含一些私有,受保护或公共方法或变量/属性,则不能使用结构。

希望这有帮助!

答案 2 :(得分:0)

结构或类的决定应基于“我是否需要引用类型语义或值类型语义?”

使用struct作为参数时,将复制完整的内容。对于类,只复制引用。所以“大结构”可能会有性能损失!

答案 3 :(得分:0)

在大多数情况下,首选课程。结构是按值传递的,没有继承等。你提到效率,这个类很可能是性能瓶颈吗?

如果您制作了一个结构,请务必将其设为immutable

答案 4 :(得分:0)

我不确定使用结构是否与良好的编码实践有关,但在某些情况下使用结构有一些性能优势。例如,MSDN建议大小小于16字节的类型可能更有效地处理结构而不是类。

理解为什么结构可能是更好的选择以及运行时如何管理它们的内存非常重要。必须以最小的开销快速执行的库将考虑使用结构(例如XNA框架中的许多Math类型)。还有一些设计问题,比如你的struct总是有一个默认的构造函数;如果你想确保你的类型只能用特定的值构造,那么结构不是最好的选择。

除非你有一个非常具体的理由在课堂上使用结构,否则只要坚持使用类。

如果你想提前结构,那么你和他们有什么问题?

答案 5 :(得分:0)

这实际上取决于你想要实现的目标。你目前只有getter和setter的事实并不意味着什么。例如,类型可能正在建模从文件读取的应用程序设置。在某些时候,您可能希望添加IsValid()或Normalize()方法。所以在这种情况下,你宁愿选择一个类,然后选择一个结构。

当类型的标识由字段的值决定时,应该使用结构。 .NET框架的一个很好的例子是Point,它有X和Y. 第二件事是结构应该很便宜来传递函数:

public bool IsInRange(Point point)
{
    // ...
}

请记住,此处将逐字段复制该点,因此应该相当便宜。

答案 6 :(得分:-1)

在以下情况下使用结构:

  • 逻辑上代表单个值
  • 实例大小小于16 字节
  • 创建后不会更改
  • 不会转换为引用类型

参考MCTS 70-536