2017-02-06 32 views
0

我可以用這樣的檢查......是否可以在運行時檢測當前未檢查/已檢查的算術上下文?

private static readonly int IntMaxValue = int.Parse(int.MaxValue.ToString()); 
private static bool IsChecked() 
{ 
    try { 
     var i = (IntMaxValue + 1); 
     return false; 
    } 
    catch (OverflowException) { 
     return true; 
    } 
} 

...但是這是一個很大的開銷在緊密循環,拋出和捕獲只是檢測到它。有沒有更簡單的方法來做到這一點?

編輯更多的背景...

struct NarrowChar 
{ 
    private readonly Byte b; 
    public static implicit operator NarrowChar(Char c) => new NarrowChar(c); 
    public NarrowChar(Char c) 
    { 
     if (c > Byte.MaxValue) 
      if (IsCheckedContext()) 
       throw new OverflowException(); 
      else 
       b = 0; // since ideally I don't want to have a non-sensical value 
     b = (Byte)c; 
    } 
} 

如果答案僅僅是「不」,不要怕簡單地說:)

+3

這有[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)寫在它的全部。你最近想要解決什麼問題? (不要介意通過一個'string'值發送'int.MaxValue'往返傳輸的意義是什麼?爲什麼要使用這個字段?爲什麼要這樣初始化?) –

+0

@PeterDuniho編譯器不會讓你明顯溢出。我只是在例子中解決這個問題。 –

+0

@PeterDuniho @PeterDuniho @PeterDuniho @PeterDuniho @PeterDuniho我在實現一個類型,我希望與原始類型具有相同的語義(在這種情況下,它是一個更大類型的轉換運算符) –

回答

1

因此,答案似乎是「不',但我想出瞭解決我的特殊問題的方案。對於最終出現這種情況的其他人可能會有用。

public NarrowChar(Char c) { 
    var b = (Byte)c; 
    this.b = (c & 255) != c ? (Byte)'?' : b; 
} 

首先,我們通過試着演員來「檢查」選中/未選中的上下文。如果我們檢查了,溢出異常由(Byte) c引發。如果我們沒有檢查,位掩碼和c的比較告訴我們鑄件是否有溢出。在我們的特定情況下,我們想要NarrowChar的語義,使得不適合ByteChar被設置爲?;就像如果您將String代碼轉換爲ISO-8759-1或ASCII代碼,您會得到?

先做演員對語義很重要。內聯b將打破「探測」行爲。

相關問題