我正在处理一个dll,它包含一个能够表示32到126之间整数值的类型,并被称为“PByte”(用于Printable Byte)。问题是我想保护用户不要用例如初始化类型。 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);
不应该是可编译的。
答案 0 :(得分:5)
您希望在编译时发生运行时异常吗?那是不可能的!
PByte pb = new PByte(get399());
应该编译吗?不,但是如何在不运行程序的情况下知道get399()
会做什么?
但首先,您应该将参数设为byte
类型。这将产生0-255之外的数字的编译时例外。
答案 1 :(得分: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'
}
}