Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用标志作为三状态参数_C# - Fatal编程技术网

C# 使用标志作为三状态参数

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一个机会,而不是使用一个可为空的bool

由于我以前从未使用过它,我想请你帮我整理几个问题:

[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)