有没有更好的方法来检查有效值?

时间:2010-12-10 21:26:51

标签: c# properties

我的类中有一个属性,它只能是多个值中的一个,限制此属性输入的最佳方法是什么。

以下是我现在正在做的事情,我相信一定有更好的方法。

public void SetValue(int value)
{
    if(value != 1 || 
        value != 4 || 
        value != 8 || 
        value != 16 || 
        value != 32 || 
        value != 64, || 
        value != 128)
    {
        property_value = 1;
    }
    else
    {
        property_value = value;
    }
}

7 个答案:

答案 0 :(得分:5)

而不是int,请使用Enum这些值。

我确信每个值都有特定的含义 - 将这些值公开为枚举成员。

这可能不会消除所有问题(因为Enum只是一个整数类型的包装器,并且仍然可以分配一个枚举中不存在的值),但是应该解决大多数问题,只要你只是从枚举本身传递值就一致。

无论如何,您可以简单地针对枚举测试传入的值,如果它不是有效的成员则抛出异常。

答案 1 :(得分:4)

使用枚举代替此数值,例如:

enum Numbers { Name1 = 1, Name2 = 4 ... }

然后你可以轻松检查值是否是枚举元素之一:

Enum.IsDefined(typeof(Numbers), value );

答案 2 :(得分:2)

对于您的示例,您可以这样做:

property_value = 1;

因为你的if条件总是如此。

如果您想将其限制为多种可能性,您可以:

声明一个枚举:

public enum Value
{
    Default = 1,
    Option1 = 4,
    ...
}

或要检查有效值的集合:

int[] validValues = new int[] { 1, 4, 8, 16, 32, 64, 128 };
property_value = validValues.Contains(value) ? value : 1;

虽然我宁愿在无效输入上抛出异常。

答案 3 :(得分:2)

我认为你应该考虑使用enum

public enum MyEnum
{
    These,
    Are,
    Valid,
    Values
}


public void SetValue(MyEnum _value)
{
   // Only MyEnum values allowed here!
}

答案 4 :(得分:1)

if(((value & (value − 1)) == 0) && value != 2 && value <= 128)
  property_value = 1;
else
  property_value = value;

(value & (value − 1))是检查value是否为2的幂的快速方法。

例如:value = 4:

(4(10) & (3(10)) =
100(2) & 011(2) =
000(2) = 0

value = 5

(5(10) & (4(10)) =
101(2) & 100(2) =
100(2) =
4

答案 5 :(得分:1)

您可以使用enum并使用Enum.IsDefined(value)进行检查。但是,你必须考虑所有可能值的(有意义的)名称。

答案 6 :(得分:0)

我认为我们在这里错过了函数的意图。

看起来就像我的面具检查一样。如果是这种情况,那么他在代码示例中缺少2。另外,请注意,如果不是其中一个特定位,他就不会丢弃一个值:他保留了它。如果 的值等于特定位(并且只有该位),则将其强制为1。

我认为Lee提供的样本在这种情况下效果最好;这很简单,也很重要。此外,如果检查被扩大到占16位(甚至32),它将很容易捕获它们。