我这样声明一个变量:
public static int aBtn;
但是唯一有效的值是0、1、2、3、4和5
有什么方法可以避免以后在限制代码时避免代码出现任何问题,以便在尝试将值设置为6时发生异常。
请注意,我仍然希望能够执行以下操作:
aBtn = aBtn + 1;
答案 0 :(得分:17)
不。这是一个很好的例子,说明了为什么公开公共字段不是一个好主意-您无法控制公共字段的使用方式。
如果将其更改为属性,则可以在设置器中验证值:
// TODO: Use a better name than either foo or aBtn
private static int foo;
public static int Foo
{
get => foo;
set => foo = value >= 0 && value < 6
? value
: throw new ArgumentOutOfRangeException("Some useful error message here");
}
如果您不喜欢在此处使用条件?:运算符,则可以使用功能强大的二传手:
public static int Foo
{
get => foo;
set
{
if (value < 0 || value > 5)
{
throw new ArgumentOutOfRangeException("Some useful error message");
}
foo = value;
}
}
或者更好的是,有一个实用方法来验证一个值并在范围之内返回输入,否则将引发异常。然后,您可以使用类似的内容:
public static int Foo
{
get => foo;
set => foo = Preconditions.CheckArgumentRange(nameof(value), value, 0, 5);
}
这是来自Noda Time的CheckArgumentRange
的略微修改版本。 (真实版本有一个单独的方法来进行投掷,我怀疑这是出于性能原因,以便可以内嵌比较部分。)
internal static int CheckArgumentRange(
string paramName, int value, int minInclusive, int maxInclusive)
{
if (value < minInclusive || value > maxInclusive)
{
throw new ArgumentOutOfRangeException(paramName, value,
$"Value should be in range [{minInclusive}-{maxInclusive}]");
}
return value;
}
答案 1 :(得分:1)
难道您不只将枚举值和唯一可能的值一起使用吗?这是定义小型分类集的好方法。
例如:
public enum RangedInt
{
cero,
one,
two,
three,
four,
five,
six = 6
}
public class MyClass
{
public RangedInt Field { get; set; }
}
答案 2 :(得分:0)
好的。使用辅助变量测试所需的值,然后,如果测试通过,则将值传递给实数变量。
我认为可以通过代码更好地表达这种想法。根据您的意愿对其进行修改:
private static int aBtn;
public static int aBtnTest
{
get
{
return aBtn;
}
set
{
if ((value<0)||(value>6))) //here you test for the values you want
//do something
}
}
要使用变量时,请使用aBtnTest
而不是aBtn
进行所有处理。这样,所有比较都会由编译器自动进行,而您不必再为此担心。