2012-08-07 34 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; 
}