C# 如何保护库用户不被错误初始化?
我正在处理一个dll,它包含一个类型,应该能够表示32到126之间的整数值,称为“PByte”(用于可打印字节)。问题是,我想保护用户不使用例如1000初始化类型。这不应引发异常。它应该防止编译,就像visualstudio尝试初始化一个字节(例如256字节)一样。该类型在构造函数中初始化C# 如何保护库用户不被错误初始化?,c#,visual-studio-2010,C#,Visual Studio 2010,我正在处理一个dll,它包含一个类型,应该能够表示32到126之间的整数值,称为“PByte”(用于可打印字节)。问题是,我想保护用户不使用例如1000初始化类型。这不应引发异常。它应该防止编译,就像visualstudio尝试初始化一个字节(例如256字节)一样。该类型在构造函数中初始化 public PByte(int value) { /* if (value < 32 || value > 126) throw new ArgumentExceptio
public PByte(int value)
{
/* if (value < 32 || value > 126)
throw new ArgumentException("\"" + value + "\" is an invalid value!"); */
this._value = value;
}
不应可编译。是否希望在编译时发生运行时异常?那是不可能的 应该
PByte pb=新的PByte(get399())代码>编译?没有,但是如果不运行程序,您怎么知道get399()
做了什么
但首先,您应该将参数设置为byte
类型。这将为0-255之外的数字生成编译时异常。唯一的选择是在超出范围时分配空字符。像这样的
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'
}
}
公共结构PByte:IEquatable
{
只读字节_值;
公共字节(字节值)
{
这个。_值=(字节)(值>31和值<128?值:0);
}
公共字节值{get{返回此值。_Value;}
公共字符char{get{return(char)_value;}
公共布尔等于(PByte其他)
{
返回值等于(其他值);
}
}
班级计划
{
静态void Main(字符串[]参数)
{
var p1=新的PByte(1000);//将不编译
变量p2=新的字节(5);/“\0”
var p3=新的PByte(65);/“A”
var p4=新的PByte(125);/“}”
var p5=新的字节(175);/“\0”
}
}
如果不修改.NET编译器,这实际上是不可能的。您如何防止类似的情况<代码>整数x=3;int y=300;PByte pb=新的PByte(x+y)代码>或从用户处获取输入的类似代码?
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'
}
}