C# 使用标志作为三状态参数
我想通过一个论点,说所有,有效或无效。我想我应该给Flags一个机会,而不是使用一个可为空的bool 由于我以前从未使用过它,我想请你帮我整理几个问题:C# 使用标志作为三状态参数,c#,C#,我想通过一个论点,说所有,有效或无效。我想我应该给Flags一个机会,而不是使用一个可为空的bool 由于我以前从未使用过它,我想请你帮我整理几个问题: [Flags] public enum Options { Valid, Invalid } private void Foo(Options options) { Debug.WriteLine(string.Format("valid: {0} {1}", (options & Options.V
[Flags]
public enum Options
{
Valid,
Invalid
}
private void Foo(Options options)
{
Debug.WriteLine(string.Format("valid: {0} {1}",
(options & Options.Valid) == Options.Valid,
options.HasFlag(Options.Valid)));
Debug.WriteLine(string.Format("invalid: {0} {1}",
(options & Options.Invalid) == Options.Invalid,
options.HasFlag(Options.Invalid)));
Debug.WriteLine("---");
}
protected void Page_Load(object sender, EventArgs e)
{
Foo(Options.Valid | Options.Invalid);
Foo(Options.Invalid);
Foo(Options.Valid);
}
/*
Output:
valid: True True
invalid: True True
---
valid: True True
invalid: True True
---
valid: True True
invalid: False False
*/
正如你所看到的,这并没有给我想要的结果。我想知道的是,是否设置了有效、无效或两个标志。如何实现这一点?对于标志,您必须指定值,以便布尔运算按预期工作:
[Flags]
public enum Options
{
Valid = (1<<0), // 1
Invalid = (1<<1), // 2
All = Valid | Invalid
}
或
什么东西既有效又无效?听起来像是矛盾修饰法。顺便说一句,如果你的枚举值是2的幂,则使用标志。@SriramSakthivel这是一种验证,用户有时也希望看到所有有效的结果。[flags]显示你是以这种方式使用它的,但实际上并不需要使用属性来这样做。@CRice yes和no:@Johan请注意,枚举以0开头,你的测试失败是由于2的幂的性质…我倾向于像我看到的1那样做。如果我想跳过所有的?options.hasvagoptions.Invalid | options.Valid?@Johan跳过是什么意思?@Johan options.hasvagoptions.Invalid&&options.hasvagoptions.Valid。。。但是为了方便=输入更少,需要引入组合状态preferred@Johan确切地说:位移位不是检查是否包含某个值的特定术语。[Flags]的全部内容都包含在:移位运算符和位运算符=位运算中
options.HasFlag(Options.Valid | Options.Invalid)
options.HasFlag(Options.All)