2011-11-07 52 views
2

我需要限制溢出值。 我实现了这个如下:C#值溢出限制

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

我这个问题的新的解决方案:

public static sbyte Clamp(this int val) 
{ 
    return (sbyte)Math.Max(Math.Min(value, sbyte.MaxValue), sbyte.MinValue); 
} 
3

这似乎是一个完全可读和有效的代码,不需要任何改进任何责任。这只是方法的名称。也许使用ToSbyte而不是LimitValueToSByte

1

想不出更好的方式来写的功能。

我叫它ClampToSByte,因为这种限制的操作通常被称为ClampLimit是一个不太具体的,并允许其他边界条件,如环绕。

,如果你对浮点数实现类似的代码,你应该小心。特别是你需要决定你想要什么样的行为和有符号的零。但幸运的是,这与积分值没有关系。

+0

签名零不应该成为一个问题。 – SLaks

+0

@Slaks不带整数。但是'(-0.0).Clamp(0,1)'返回'-0',这在所有情况下都可能不是所希望的。 – CodesInChaos

+1

我知道有符号的零,但它们在这里不会引起问题。在.Net中,“-0.0”与“0.0”无法区分。 – SLaks

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); 
+0

我会使用'IComparable '来避免价值类型的装箱。 – CodesInChaos

+0

@CodeInChaos:我不知道会阻止拳击。谢谢。 –