C# 如果不使用异常,哪种技术是正确的?

C# 如果不使用异常,哪种技术是正确的?,c#,.net,C#,.net,假设我有一节这样的课 class A { private int _x; //must be between [-10 10] private int _y; //must be between [10 20] } 使用属性,我有两个变量的变体 public int X { get { return _x; } set { if (!(value >= -10 && value <= 10))

假设我有一节这样的课

class A
{
    private int _x; //must be between [-10 10]
    private int _y; //must be between [10 20]
}
使用属性,我有两个变量的变体

public int X
{
    get { return _x; }
    set
    {
        if (!(value >= -10 && value <= 10))
            throw new Exception("Some error text");
        _x = value;
    }
}
public int X
{
获取{return\ux;}
设置
{

如果(!(value>=-10&&value=-10&&value=-10&&value在.Net中检查值有效性与否的标准模式是创建一个先检查值的方法,那么让类的用户调用它并处理结果,然后抛出异常

例如:

public bool IsValueValid(xxx)
{

}

public void SetValue(xxx)
{
    if(!this.IsValueValid())
    {
        throw Exception();
    }
}

通常,必须存储该值的类不知道如何处理无效值,调用方的工作就是知道如何处理该值。

让我们直接开始;异常可能“缓慢”,但这正是为什么您只在异常情况下使用它们的原因

在您的情况下,如果某个数字超出给定范围是异常的(即,不应发生)然后您可以抛出异常。但是,如果这类似于用户输入,那么用户在可接受范围之外填充值肯定不是异常!在这种情况下,您需要验证输入的值是否在可接受范围内

关于此解决方案的另一点:

set
{
    if (!(value >= -10 && value <= 10))
        return;
    _x = value;
}
set
{

如果(!(value>=-10&&value通常的方法是在这种情况下提高。如果您不想处理异常,您可以引入自定义标志
IsValid
(正如您已经提到的)

要保持属性范围,我建议为此引入自定义属性,并按如下方式标记属性:

public bool IsValid { }

[ValueRange(Max = 10, Min = 5)]
public int X
{
    set
    {
       this.ValidateValueRange(this.X, value);
    }
}

private bool ValidateValueRange(...)
{
   // 1. Get property value (see link below regarding retrieving a property)
   // 2. Get ValueRange attribute values
   // 3. Update this.IsValid
   // 4. Return ...
}
然后实现单个方法来检查传入的
是否在范围内

有用链接:

坚持

public int X
{
    get { return _x; }
    set
    {
        if (!(value >= -10 && value <= 10))
            throw new Exception("Some error text");
        _x = value;
    }
}
public int X
{
获取{return\ux;}
设置
{

如果(!(value>=-10&&value如果您希望验证从UI接收到的用户输入,那么我建议您使用验证器方法,在这种方法中,您可以告知用户预期的内容


在其他情况下,如果您已决定不显示异常的成本,并继续使用任何安全/默认值或使用自定义异常中断流,则这是一种折衷办法。

我尝试给出一些流,如何决定在此处使用什么:

set
{
    if (!(value >= -10 && value <= 10))
        throw new Exception("Some error text");
    _x = value;
}
如果您不希望频繁出现“无效”情况,那么一定要使用异常

set
{
    if (!(value >= -10 && value <= 10))
        throw new Exception("Some error text");
    _x = value;
}
set
{

如果(!(value>=-10&&value=-10&&value=-10&&value=-10&&value)抛出异常。最好尽快知道某个操作失败,而不是检查某个变量来解决这个问题。如果您对C非常熟悉,就好像必须在
errno
和异常之间进行选择。使用它并不总是最好的。
set
{
    if (!(value >= -10 && value <= 10))
        throw new Exception("Some error text");
    _x = value;
}
set
{
    if (value >= -10 && value <= 10)
        _x = value;
    // else optionally log something
}