4

我正在研究一个 dll,它包含一个应该能够表示从 32 到 126 的整数值的类型,称为“PByte”(用于可打印字节)。问题是我想保护用户不使用例如 1000 初始化类型。这不应该引发异常。它应该防止编译,就像 Visiual Studio 尝试用 256 初始化一个字节一样。类型在构造函数中初始化。

public PByte(int value)
{
    /* if (value < 32 || value > 126)
        throw new ArgumentException("\"" + value + "\" is an invalid value!"); */
    this._value = value;
}

这个

PByte pb = new PByte(2000);

不应该是可编译的。

4

2 回答 2

5

您希望在编译时发生运行时异常吗?这不可能!

应该PByte pb = new PByte(get399());编译吗?get399()不,但是如果不运行程序,你怎么能知道呢?

但首先你应该使参数成为一个byte类型。这将为 0-255 之外的数字产生编译时异常。

于 2012-08-07T21:55:32.573 回答
2

您唯一的选择是在超出范围时分配一个空字符。像这样的东西。

public struct PByte : IEquatable<PByte>
{
    readonly byte _value;
    public PByte(byte value)
    {
        this._value = (byte)( value > 31 && value < 128 ? value : 0);
    }
    public byte Value { get { return this._value; } }
    public char Char { get { return (char)_value; } }
    public bool Equals(PByte other)
    {
        return _value.Equals(other._value);
    }        
}

class Program
{
    static void Main(string[] args)
    {
        var p1 = new PByte(1000); // Won't compile
        var p2 = new PByte(5);      //'\0'
        var p3 = new PByte(65);     //'A'
        var p4 = new PByte(125);    //'}'
        var p5 = new PByte(175);    //'\0'
    }
}
于 2012-08-12T00:07:27.060 回答