Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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# [Flags]属性的真正作用是什么?_C#_.net_Enums_Flags_Bitflags - Fatal编程技术网

C# [Flags]属性的真正作用是什么?

C# [Flags]属性的真正作用是什么?,c#,.net,enums,flags,bitflags,C#,.net,Enums,Flags,Bitflags,申请到底是做什么的 我知道它修改了的行为,但它还有其他作用吗?(例如,不同的编译器或运行时行为等) 编辑:是的,我知道它记录了这样一个事实,即枚举打算用作位标志,将其应用于位标志更符合逻辑。不过,我问的更多的是具体的行为变化,而不是一般的编程实践。以下是具体的行为差异列表: 将[flags]的枚举设置为None将清除所有标志 HasFlags方法仅在存在此属性时有效 正如Devio所说,它改变了解析和格式化方法的功能。他链接到。显然,它也会影响调试器中显示的内容 我认为[flags]可能会对

申请到底是做什么的

我知道它修改了的行为,但它还有其他作用吗?(例如,不同的编译器或运行时行为等)



编辑:是的,我知道它记录了这样一个事实,即枚举打算用作位标志,将其应用于位标志更符合逻辑。不过,我问的更多的是具体的行为变化,而不是一般的编程实践。

以下是具体的行为差异列表:

  • 将[flags]的枚举设置为None将清除所有标志
  • HasFlags方法仅在存在此属性时有效
  • 正如Devio所说,它改变了解析和格式化方法的功能。他链接到。显然,它也会影响调试器中显示的内容
  • 我认为[flags]可能会对Web服务中的代码生成产生影响,但是
  • 明确地说,无论是否有[flags],都允许对任何枚举执行逐位操作。但使用它是最佳实践

更多详细信息:

如果你问它在引擎盖下做什么,据我所知,它改变了ToString()方法,没有其他改变


在.NET4下,您可以使用-method检查特定标志。如果我正确解释了msdn,那么您必须使用flags属性来使用此方法。但我没有尝试过。

在实践中,我使用的一个用法是指示多个状态。这是评估测试结果的一些代码的简化。测试可以是正常的,也可以有几个不正常的原因。这样做的好处是,我有一种方法可以评估测试的“Ok ness”,并且该方法能够通过一次返回指示所有可能的故障条件。可能不是最好的设计,但在这种情况下它是有效的

[Flags]
public enum ResultStatusEnum
{
    Ok = 0x1,
    SampleInvalid = 0x2,
    DirectionInvalid = 0x4,
    TestIsNotValid = 0x8
}
您可以这样设置:

ResultStatusEnum res = ResultStatusEnum.SampleInvalid | ResultStatusEnum.DirectionInvalid;
缺点是检查枚举的值变得很麻烦。这(不一定)起作用:

您必须执行此操作以检查:

ResultStatusEnum.SampleInvalid == (res & ResultStatusEnum.SampleInvalid)
在这种情况下,让
ResultStatusEnum.Ok&ResultStatusEnum.SampleInvalid
是不合逻辑的,但我要确保我使用的不是枚举。

来自:

有趣的是,当 指定标志、解析和格式化 方法具有高级功能

同样,解析方法也可以 成功分析逗号分隔的 字符串,就像刚才显示在中的字符串一样 正确的数值

见大卫·M·基恩的帖子。这似乎是一个语言互操作问题:

尽管C#很高兴允许用户在没有FlagsAttribute的情况下对枚举执行位操作,但VisualBasic不允许。所以,若要向其他语言公开类型,那个么使用FlagsAttribute标记枚举是一个好主意;它还明确指出,enum的成员被设计为一起使用

问候

大卫


Flags提供了对多个值使用枚举的选项

考虑这样一种情况,即您希望为不同的情况使用复选框,但不希望在数据库中创建不同的列。如果有20个复选框,则必须使用bool在数据库中创建20列。但是使用标志可以创建一列并使用该值存储在列中。在控制台中运行此示例以更好地理解它

class Program
{
    static void Main(string[] args)
    {
        //Set the features that you require for car. Consider it as checked in the UI.
        CarFeatures carFeatures = CarFeatures.AC | CarFeatures.Autopilot| CarFeatures.Sunroof;

        //Do the backend logic
        if (carFeatures.HasFlag(CarFeatures.Autopilot))
        {
            //Show Autopilot cars
        }
        //See the what carfeatures are required
        Console.WriteLine(carFeatures);
        //See the integer value of the carfeatures
        Console.WriteLine((int)carFeatures);
        Console.ReadLine();
    }
}

[Flags]
public enum CarFeatures
{
    AC=1,
    HeatedSeats= 2,
    Sunroof= 4,
    Autopilot= 8,
}

不同的组合总是会给你一个唯一的数字,c#会追踪这个数字以找到所有标记的内容。

看看@sqlnemage:这只是说明我应该何时应用它以及如何编写代码,而不是它是否改变了任何行为\+我已经问过自己很多次了,我想看到@Eric Lippert对此发表评论。是的,但是如果它没有这样修饰,其他语言可能/可能无法正确处理枚举。如果都是C#,我想这并不重要。不过,当我看到它时,我希望它有这样的用途。没有它,我不希望看到一点明智的使用。所以它有助于提高可读性。我想这取决于你所说的“句柄”是什么意思。当然,它们仍然可以以同样的方式对它们进行位运算,但它们是否首先允许它们似乎是一个问题,根据什么,+1似乎是迄今为止最好的答案。我不知道它会改变
解析的行为
…+1伟大的(出乎意料的)答案。:)(虽然我不得不承认,对我来说“.NET”几乎只是同一种语言的不同形式。不过,这仍然是一个很好的答案。)如果你把那篇文章的内容复制到你的答案中,你的答案会更好。Hrmm。。。我刚刚检查过,VB并没有像这篇文章所暗示的那样,自动将[flag]枚举赋值为2的幂。它以通常的方式增加它们——增加1。
class Program
{
    static void Main(string[] args)
    {
        //Set the features that you require for car. Consider it as checked in the UI.
        CarFeatures carFeatures = CarFeatures.AC | CarFeatures.Autopilot| CarFeatures.Sunroof;

        //Do the backend logic
        if (carFeatures.HasFlag(CarFeatures.Autopilot))
        {
            //Show Autopilot cars
        }
        //See the what carfeatures are required
        Console.WriteLine(carFeatures);
        //See the integer value of the carfeatures
        Console.WriteLine((int)carFeatures);
        Console.ReadLine();
    }
}

[Flags]
public enum CarFeatures
{
    AC=1,
    HeatedSeats= 2,
    Sunroof= 4,
    Autopilot= 8,
}