2011-11-07 51 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:我不知道會阻止拳擊。謝謝。 –