Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何保护库用户不被错误初始化?_C#_Visual Studio 2010 - Fatal编程技术网

C# 如何保护库用户不被错误初始化?

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

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

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'
    }
}