2012-08-07 64 views
4

我正在研究一個名爲PByte的類,它應該表示32和126之間的整數值。(PByte =可打印字節) 現在我想阻止類的用戶錯誤地初始化一個對象,但我不想「不想拋出異常,我只想說的Visual Studio不能編譯,就像它發生在你嘗試這樣做:byte b = 256;如何讓用戶不正確地初始化一個變量?

sealed class PByte : IEquatable<PByte>, IComparable, IComparable<PByte> 
{ 
    public PByte(int value) 
    { 
     /* if (value < 32 || value > 126) 
      throw new ArgumentException("\"" + value + "\" is not a valid PByte-value"); */ 
     this._value = value; 
    } 

[...] 

我也實現了這個:

[...] 

    public static implicit operator PByte(int value) 
    { 
    /* if (value < 32 || value > 126) 
      throw new ArgumentException("\"" + value + "\" is not a valid PByte-value"); */ 
     return new PByte(value); 
    } 
} 

所以這也應該是不可能的: PByte p = 2000;

+1

代碼合同可能? http://msdn.microsoft.com/en-us/magazine/ee236408.aspx – asawyer 2012-08-07 18:20:15

回答

5

您不能在編譯時強制執行,而不使用代碼合同。即使那樣,我認爲代碼合同只會產生警告,一般會將問題的所有權放在調用範圍上。

1

大多數情況下,您可以使用Code Contracts與編輯器擴展(可在擴展庫中獲得)結合使用。不過,我不確定它是否會全面執行所有情況。 (編輯:在您的項目的屬性的Code Contracts部分打開靜態檢查。)

所以,大概,你可以做這樣的事情:

public PByte(int value) 
{ 
    Contract.Requires<ArgumentException>(value >= 32 && value <= 126, "\"" + value + "\" is not a valid PByte-value"); 
    this._value = value; 
}