在C#中使用结构体来表示简单的域值

时间:2009-09-27 21:03:53

标签: c# .net struct dns

我正在编写一个财务应用程序,其中使用了“价格”的概念。它目前由C#decimal类型表示。我想让它更明确,并且能够在将来将其更改为double,所以我想创建一个基本上与十进制类型完全相同的'Price'结构(可能是添加)一些验证,如必须大于0)。

您认为这样做的利弊是什么?

4 个答案:

答案 0 :(得分:5)

不要使用双倍钱。您必须记住将其四舍五入以显示您在其中使用的所有,并且如果您将大数除以或乘以,则存在潜在的准确性问题。十进制将给出溢出错误,双重将失去准确性。我不确定你,但是有钱,我更喜欢错误和中止操作,无声地继续进行准确性的降低。

如果有的话,基于我一直在进行的项目,你可能会考虑使用一个带小数的结构,并指出它是什么货币。

答案 1 :(得分:4)

结构应该用于(我认为)不可变的小类型,即值类型。我不确定“大量使用”是什么意思,但如果这些结构在性能关键操作中会被大量传递,则必须考虑复制它们的价格与堆分配的价格。我怀疑你是否需要考虑到这一点,但这是需要考虑的事情。我很少发现在日常活动中需要使用结构。

另外,正如Jonathan指出的那样,使用双重类型是一个坏主意。十进制类型更适合财务计算。

还有一个;你可能会听到很多关于堆栈v堆分配的回复,所以这篇文章可能会让你感兴趣:

http://blogs.msdn.com/ericlippert/archive/2009/04/27/the-stack-is-an-implementation-detail.aspx

答案 2 :(得分:0)

没有理由更改此类数量的数据类型;但是,您可以决定添加其他信息,例如货币或小数位数,以便在计算中跟踪,因此在此时使用结构将为您节省大量时间。

答案 3 :(得分:-1)

除了C#之外的.NET语言可能无法访问结构。舍入错误也可能是一个问题。为什么不创建Money类并将值存储为Decimal和使用的货币。