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
}