4

我正在研究一个名为 PByte 的类,它应该表示 32 到 126 之间的 int 值。(PByte = Printable Byte。)现在我想防止该类的用户错误地初始化一个对象,但我不想要抛出异常,我只希望 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;

4

2 回答 2

5

如果不使用代码合同,您将无法在编译时强制执行该操作。即便如此,我认为代码合同只会产生警告,并且通常会将问题的所有权放在调用范围内。

于 2012-08-07T18:20:18.497 回答
1

您主要可以使用Code Contracts和编辑器扩展(可在 Extensions Gallery 中获得)来完成此操作。不过,我不确定它是否会完全执行每一种情况。Code Contracts(编辑:在项目的属性部分打开静态检查。)

所以,粗略地说,你可以做这样的事情:

public PByte(int value)
{
    Contract.Requires<ArgumentException>(value >= 32 && value <= 126, "\"" + value + "\" is not a valid PByte-value");
    this._value = value;
}
于 2012-08-07T18:26:30.400 回答