【发布时间】:2010-10-03 11:38:05
【问题描述】:
我有一个代表形状的类。 Shape 类有一个名为 Angle 的属性。我希望此属性的设置器自动将值包装到 [0,359] 范围内。
不幸的是,简单的_Angle = value % 360; 仅适用于正数。在 C# 中,-40 % 360 == -40。谷歌计算它the way I want it。该值应为 320。
C# 中最优雅的解决方案是什么?
这是我目前为止最好的方法:
public double Angle {
get { return _Angle; }
set {
if ( value >= 0 ) {
_Angle = value % 360;
}
else {
_Angle = value - (360 * ((int)(value / 360) - 1));
}
}
}
编辑:
谢谢大家,我现在有:
public double Angle {
get { return _Angle; }
set {
_Angle = (value % 360) + ((value < 0) ? 360 : 0);
}
}
..哪个更好:)
【问题讨论】:
-
我强烈反对使用 mod 操作,因为硬件 mod/division 很慢。如果您能够将数据扩展为 2 的幂,则可以使用更好的利用位掩码的解决方案。
-
@TrevorBoydSmith:C# 编译器是否不允许在整数的情况下优化除法和模到位运算?在浮点值的情况下你能优化位操作吗?