【问题标题】:Should I use a Struct? [duplicate]我应该使用结构吗? [复制]
【发布时间】:2011-04-30 15:30:34
【问题描述】:

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

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

谢谢, 斯图尔特

【问题讨论】:

  • 这是一模一样的副本。不要提供更多答案。这是没有意义的。

标签: c# struct


【解决方案1】:

如果值的集合模拟了一个值类型(也就是说,没有自己的标识并且具有相同值的两个实例被认为是相同的 em>) 使用结构。

否则,使用一个类。

【讨论】:

  • 谢谢,从此我会继续使用类。
【解决方案2】:

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

希望这会有所帮助!

【讨论】:

  • struct 可以有私有方法。但是,“受保护”方法没有意义,因为您不能从结构派生。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    你在以下情况下使用结构:

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

    请参阅 MCTS 70-536

    【讨论】:

    • 有时希望结构大于 16 字节。使用“如果您不打算在创建实例后重新分配实例。”你可能的意思是:'你想要一个(应该)不可变的类型'
    • 也许你不喜欢那句话,我也不喜欢,我认为现在更好,MS 推荐的结构。
    【解决方案5】:

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

    如果你创建了一个结构体,请确保它是immutable

    【讨论】:

      【解决方案6】:

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

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

      总而言之,除非您有非常具体的原因要在类上使用结构,否则请坚持使用类。

      如果你想继续推进结构,你对它们有什么问题?

      【讨论】:

        【解决方案7】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-06-18
          • 1970-01-01
          • 1970-01-01
          • 2014-05-03
          • 2010-10-10
          • 2021-09-03
          • 2014-07-05
          • 1970-01-01
          相关资源
          最近更新 更多