enum上加[flag]attribute与不加有啥区别

delectation 2008-10-11 08:41:31
rt
...全文
469 7 打赏 收藏 举报
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
pkjijie 2010-12-30
...不是语法的问题 而是逻辑的要求~~huhu
  • 打赏
  • 举报
回复
brallow 2008-10-13
哈,我想楼上的理解也不全面。
vrhero的说法是正确的,只是有一个地方说得你可能没太明白。
对于标记了Flags的枚举类型,编译器不会强制要求你赋值。
但是编译器也不会根据Flags来自动给出符合Flags规范的值。
举例来说:

[Flags]
public enum ClientStates
{
Ordinary=0, // 0000
HasDiscount=1, // 0001
IsSupplier=2, // 0010
IsBlackListed=4, // 0100
IsOverdrawn=8 // 1000
}

上述定义,实际上是每个不同的枚举成员都指定了某一个Bit的位置信息。它们之间的关系大体上是 *2的关系(除了第一个为0外)。
而如果你不强制定义这个值编译器生成的枚举类型值为:

[Flags]
public enum ClientStates
{
Ordinary=0, // 0000
HasDiscount=1, // 0001
IsSupplier=2, // 0010
IsBlackListed=3, // 0011
IsOverdrawn=4 // 0100
}

这是你想要的结果吗??
  • 打赏
  • 举报
回复
delectation 2008-10-13
[Quote=引用 4 楼 vrhero 的回复:]
引用 3 楼 warrior 的回复:
加Flag属性,使得Enum按二进制位的方式表示每个枚举值,如:
[Flags]
public enum ClientStates
{
Ordinary, // 0000
HasDiscount, // 0001
IsSupplier, // 0010
IsBlackListed, // 0100
IsOverdrawn // 1000
}
这样可以对枚举值进行位操作。
可以看这篇文章:
http://weblogs.asp.net/wim/archive/2004/04/07/109095.aspx

解释对了,代码错了…
[/Quote]


谢谢两位。
一楼的代码是对的,加Flag属性不必显式赋值.如果第一个enum的值不想为0000,就必须显式的赋值了。
  • 打赏
  • 举报
回复
vrhero 2008-10-11
[Quote=引用 3 楼 warrior 的回复:]
加Flag属性,使得Enum按二进制位的方式表示每个枚举值,如:
[Flags]
public enum ClientStates
{
Ordinary, // 0000
HasDiscount, // 0001
IsSupplier, // 0010
IsBlackListed, // 0100
IsOverdrawn // 1000
}
这样可以对枚举值进行位操作。
可以看这篇文章:
http://weblogs.asp.net/wim/archive/2004/04/07/109095.aspx
[/Quote]
解释对了,代码错了...加Flag属性必须显式赋值...
[Flags] 
public enum ClientStates
{
Ordinary = 0, // 0000
HasDiscount = 1, // 0001
IsSupplier = 2, // 0010
IsBlackListed = 4, // 0100
IsOverdrawn = 8 // 1000
}


[Quote=引用 MSDN:]
下面的代码示例阐释 enum 声明上的 System..::.FlagsAttribute 属性的使用和效果。

复制代码
// enumFlags.cs
// Using the FlagsAttribute on enumerations.
using System;

[Flags]
public enum CarOptions
{
SunRoof = 0x01,
Spoiler = 0x02,
FogLights = 0x04,
TintedWindows = 0x08,
}

class FlagTest
{
static void Main()
{
CarOptions options = CarOptions.SunRoof | CarOptions.FogLights;
Console.WriteLine(options);
Console.WriteLine((int)options);
}
}
[/Quote]
  • 打赏
  • 举报
回复
warrior 2008-10-11
加Flag属性,使得Enum按二进制位的方式表示每个枚举值,如:
[Flags]
public enum ClientStates
{
Ordinary, // 0000
HasDiscount, // 0001
IsSupplier, // 0010
IsBlackListed, // 0100
IsOverdrawn // 1000
}
这样可以对枚举值进行位操作。
可以看这篇文章:
http://weblogs.asp.net/wim/archive/2004/04/07/109095.aspx
  • 打赏
  • 举报
回复
ws_hgo 2008-10-11
路过学习
  • 打赏
  • 举报
回复
chaye12 2008-10-11
[]里面的一般相当于注释,听高手如果做答的!
  • 打赏
  • 举报
回复
相关推荐
发帖
C#

10.8w+

社区成员

.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
帖子事件
创建了帖子
2008-10-11 08:41
社区公告

让您成为最强悍的C#开发者