我有一个数学密集的类,在一个对象上执行一些公式/方程式(对象不是我的代码中的类,而是一个真实的世界对象)。
无论如何,我想知道,在我的课程下,我应该将所有属性和字段移动到结构中吗?这会是一个糟糕的设计吗?
根据我的学习,结构应该对这样的东西很有用。这也意味着我可以从方法返回结构并使代码更具原子性(struct有数据,类有逻辑)。如果我保留当前的设计并返回一个带有写入变量的类,那么返回结构会有什么不同?我知道结构和类之间的区别,但我不确定它们是否会产生很大影响。
由于
答案 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,则抛出某种异常)。当然,更多的控制,比如让它只对组件可见等。