C# 这在C中到底意味着什么?

C# 这在C中到底意味着什么?,c#,C#,我正在浏览一个开源的.NET twain包装,看到了以下内容: [Flags] internal enum TwDG : short { // DG_..... Control = 0x0001, Image = 0x0002, Audio = 0x0004 } 那个“旗帜”装饰者到底是什么意思?它叫“装饰师”吗 另外,enum声明末尾的短字符是什么意思 谢谢 这使枚举成为位标志。 这意味着您可以将各个

我正在浏览一个开源的.NET twain包装,看到了以下内容:

[Flags]
internal enum TwDG : short
{                                   // DG_.....
    Control = 0x0001,
    Image = 0x0002,
    Audio = 0x0004
}
那个“旗帜”装饰者到底是什么意思?它叫“装饰师”吗

另外,enum声明末尾的短字符是什么意思


谢谢

这使枚举成为位标志。 这意味着您可以将各个值组合在一起。 比如:

它的值为7

单个枚举值的值通常为2^n。但也可以这样组合:

[Flags]
public enum Sides
{
    Left = 1,
    Right = 2,
    Up = 4,
    Down = 8,

    LeftAndRight = 3,
    UpAndDown = 12,

    AllSides = 15
}
标志是一个属性;具体来说

这意味着编译器允许您使用TwDG类型的值作为位字段,即,在一个值中存储任意数量的值,如下所示:

var control = TwDG.Control;
var allTogether = TwDG.Control | TwDG.Image | TwDG.Audio;
var hasAudio = (myValue & TwDG.Audio) != (TwDG) 0;
通常,当某些代码需要根据是否设置了这些标志之一而采取不同或可选的操作时,就会执行此操作。例如,假设我们想要描述视频文件的内容,其中可能包含音频和图片。你可以写:

var imageAndAudio = TwDG.Image | TwDG.Audio;
var muteImage = TwDG.Image;
然后,如果您想检查文件是否包含音频曲目,您可以选择音频标志,如下所示:

var control = TwDG.Control;
var allTogether = TwDG.Control | TwDG.Image | TwDG.Audio;
var hasAudio = (myValue & TwDG.Audio) != (TwDG) 0;
用于允许和修饰枚举,以便对枚举值执行逐位数学操作

这样可以将它们添加到一起,或添加其他操作项


Short部分将其定义为Short而不是整数,链接URL中也有关于这一点的详细信息

它的flag属性,您可以在此处阅读:


允许您将一组枚举视为一个位标志集。

我以前听说过它们被称为decorators,在社区中可以将它们标记为decorators,但严格来说,这是为了参数;这是一种属性。它用于将枚举标记为位标志类型。
以下是。

short表示枚举使用short而不是int作为其基类型。 至于旗帜

至于[Flag]——你应该看看这里


Short—数据时间,用于存储枚举值。

Short是System.Int16的另一个关键字,它是一个从-32768到32767的两字节整数。默认情况下,枚举的基类型为int;在本例中,他们试图使用较小的数据类型来存储枚举数值

这意味着您给出了一个提示,该枚举将用于按位or操作

var flags = TwDG.Control | TwDG. Image;
Console.WriteLine(flags.HasFlag(TwDG.Image));   // true
Console.WriteLine(flags.HasFlag(TwDG.Control)); // true
Console.WriteLine(flags.HasFlag(TwDG.Audio));   // false
更多信息Enum.HasFlag已添加到Framework 4.0中


Short的意思是,这个枚举的back类型不是int,int是枚举的默认选项,而是Short。您还可以指定long、ushort或任何其他内置整数类型。

这是一个属性。尽管其他人说这是必要的,以便您可以使用enum执行位翻转操作,但事实并非如此。可以使用不带此属性的枚举执行此操作

如果应用了该属性,则会在枚举上获得不同的ToString输出,这将漂亮地打印枚举值的组合成员,例如蓝色|红色|橙色,而不是7


short关键字表示枚举成员的类型将是a。

Woops!忘记格式化代码了!这叫做属性。看,这并不完全准确。可以在不使用属性的情况下执行位翻转。通过对组合成员的搜索,您确实可以获得非常好的打印效果。@chibacity:除非您参加代码混淆比赛,否则我强烈建议您不要这样做。@code我不确定我是否了解您。答案是必须的。事实并非如此。我不是在这里提倡最佳实践。@chibacity:很抱歉,答案必须经过编辑,以删除它所说的执行按位操作所需的内容。我只是想说明这远远不是最佳实践。@Code答案尚未编辑。它声明allow==required。编译器允许您在不使用Flags属性的情况下执行所有这些操作。Flags控制解析和格式化,仅此而已。我接受更正。升级的经典例子我永远不会这么做,显然编译器不会让我这么做。