在类中的结构中粘贴所有变量还是将它们留在类中?

时间:2009-01-13 22:58:42

标签: c#

我有一个数学密集的类,在一个对象上执行一些公式/方程式(对象不是我的代码中的类,而是一个真实的世界对象)。

无论如何,我想知道,在我的课程下,我应该将所有属性和字段移动到结构中吗?这会是一个糟糕的设计吗?

根据我的学习,结构应该对这样的东西很有用。这也意味着我可以从方法返回结构并使代码更具原子性(struct有数据,类有逻辑)。如果我保留当前的设计并返回一个带有写入变量的类,那么返回结构会有什么不同?我知道结构和类之间的区别,但我不确定它们是否会产生很大影响。

由于

3 个答案:

答案 0 :(得分:4)

对于.NET,struct和class的定义(“struct has data,class has logic”)是不正确的;结构可以很好地具有逻辑。结构定义具有值类型语义的类型。类定义具有引用类型语义的类型。 这是唯一(虽然主要)差异

我不会,不。 .NET中的结构通常应该是不可变的;这会强制您一次更新所有值。使用可变类,您可以根据需要更新单个属性/字段。在围绕变异对象设计的CPU密集型用例中,这可能会产生很大的不同。当然,如果你不改变状态,那就没那么重要,但我可能仍然倾向于坚持上课:

当你传递一个类实例时,你传递的只是引用;使用结构,您需要克隆并传递结构中的数据。使用struct时,这可以使密集的工作更多密集(除非你经常使用ref)。

重新“并返回一个带有书面变量的类” - 你的意思是公共领域吗?不建议这样做。对于countless oft-repeated reasons,属性是更可取的。

答案 1 :(得分:2)

“结构有数据和类有逻辑”的想法是对概念的误解。 在C#中不是这样。来自C# Language Specification 3.0

  

与类类似,结构体是数据   可以包含数据的结构   成员和职能成员,但   与类不同,结构是有价值的   类型,不需要堆   分配。结构的变量   type直接存储数据   struct,而类的变量   type存储对a的引用   动态分配对象。

Jon Skeet在Stack Overflow上写了excellent answer about classes and structs。我建议阅读它。在这里复制它是没有意义的。此问题的其他答案也非常好。

回答你的问题:将类中的所有数据分组到另一个类中是有意义的,因为你可以。相信我,即使这会加速事情(这是我怀疑的事情),这将成为瓶颈。如果某些数据可以分组为子组,则可能需要将类重构为较小的类。 (不仅仅是数据,但也可能是功能成员)

答案 2 :(得分:1)

谢谢你们。

由于上述重要原因,我会坚持退课。

返回一个带有写入变量的类 - 我总是使用属性来读/写。最明显的原因是我可以在需要时为属性提供逻辑(例如,如果值小于18,则抛出某种异常)。当然,更多的控制,比如让它只对组件可见等。