在C#中,有什么方法可以限制int变量的范围?

时间:2019-05-18 09:47:48

标签: c#

我这样声明一个变量:

public static int aBtn;

但是唯一有效的值是0、1、2、3、4和5

有什么方法可以避免以后在限制代码时避免代码出现任何问题,以便在尝试将值设置为6时发生异常。

请注意,我仍然希望能够执行以下操作:

aBtn = aBtn + 1; 

3 个答案:

答案 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进行所有处理。这样,所有比较都会由编译器自动进行,而您不必再为此担心。