我的类中有一个属性,它只能是多个值中的一个,限制此属性输入的最佳方法是什么。
以下是我现在正在做的事情,我相信一定有更好的方法。
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;
}
}
答案 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),它将很容易捕获它们。