我声明了这样的变量:
public static int aBtn;
,但唯一有效的值是0,1,2,3,4和5
有什么方法可以避免以后在限制时避免任何问题,以便如果我试图将值设置为6,就会发生例外情况。
请注意,我仍然希望能够做以下事情:
aBtn = aBtn + 1;
no。这是一个很好的例子,说明为什么公开领域是一个坏主意 - 您无法控制它们的使用方式。
如果将其更改为属性,则可以验证设置器中的值:
// 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时间的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;
}
您不能只使用唯一可能值的枚举吗?这是定义小型套件的好方法。
例如:
public enum RangedInt
{
cero,
one,
two,
three,
four,
five,
six = 6
}
public class MyClass
{
public RangedInt Field { get; set; }
}
当然。使用辅助变量测试您希望的值,然后,如果测试正常,则将值传递给真实变量。
我认为通过代码更好地表达了这个想法。根据您的意愿进行修改:
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
进行所有处理。通过这样做,所有比较都是由编译器自动进行的,您不必为此担心。