我需要限制溢出值。 我按如下方式实现了这个:
public static sbyte LimitValueToSByte(this int val)
{
if (val > sbyte.MaxValue) return sbyte.MaxValue;
if (val < sbyte.MinValue) return sbyte.MinValue;
return (sbyte)val;
}
有更优雅的方式吗?
这是时间关键系统中的代码,因此性能非常重要。
答案 0 :(得分:3)
这似乎是一个完全可读且有效的代码,无需任何改进。它只是方法的名称。也许使用ToSbyte
而不是LimitValueToSByte
。
答案 1 :(得分:1)
想不出更好的方法来编写这个功能。
我称之为ClampToSByte
,因为这种限制操作通常称为Clamp
。 Limit
稍微不那么具体,并允许其他边界条件,例如环绕。
如果为浮点数实现类似的代码,则应该小心。特别是,您需要确定NaN
和签名零所需的行为。但幸运的是,积分值没有问题。
答案 2 :(得分:0)
对我来说很好看。如果你想要更优雅的东西,通用钳位功能如何?
public static T Clamp<T>(this T value, T min, T max)
where T : IComparable<T>
{
if (value.CompareTo(min) <= 0) return min;
if (value.CompareTo(max) >= 0) return max;
return value;
}
(警告:我没有测试过。)你可以这样使用它:
int a = 42;
sbyte b = (sbyte)a.Clamp(sbyte.MinValue, sbyte.MaxValue);
答案 3 :(得分:0)
我对此问题的新解决方案:
public static sbyte Clamp(this int val)
{
return (sbyte)Math.Max(Math.Min(value, sbyte.MaxValue), sbyte.MinValue);
}