2016-06-21 85 views
1

好了,所以我是新来的C#,对我的生活中,我无法理解究竟是什么下面的代码(从一个传统的项目)是应该做的:标志和<<枚举操作? C#

[Flags] 
public enum EAccountStatus 
{ 
    None = 0, 
    FreeServiceApproved = 1 << 0, 
    GovernmentAccount = 1 << 1, 
    PrivateOrganisationAccount = 1 << 2, 
    All = 8 
} 

究竟做了<<运营商做这里的枚举?我们为什么需要这个?

+0

请检查pmg的答案:http://stackoverflow.com/questions/3999922/why-use-the-bitwise-shift-operat or-for-values-in-a-c-enum-definition – manish

+0

想知道为什么他不使用'All = 1 << 3'? –

+0

谢谢@manish,这也是一个辉煌的答案:) –

回答

4

在幕后,枚举实际上是一个int。
<<Bitwise Left Shift Operator
编写这些代码的等效方法是:

[Flags] 
public enum EAccountStatus 
{ 
    None = 0, 
    FreeServiceApproved = 1, 
    GovernmentAccount = 2, 
    PrivateOrganisationAccount = 4, 
    All = 8 
} 

请注意,此枚举有Flag attribute

正如MSDN指出:

使用FlagsAttribute的枚举自定义属性只有在 按位运算(AND,OR,EXCLUSIVE OR)为p在 数字值上执行。

这样,如果你想有多个选项设置可以使用:

var combined = EAccountStatus.FreeServiceApproved | EAccountStatus.GovernmentAccount 

这相当于:

00000001 // =1 - FreeServiceApproved 
| 00000010 // =2 - GovernmentAccount 
--------- 
    00000011 //= 3 - FreeServiceApproved and GovernmentAccount 

this SO thread有大约flags attribute

一个比较好的解释
+0

谢谢Avi,那是精美的解释:) –

+0

:)我很高兴我可以帮忙。 –

2

<<正在做什么,即左移操作。

至于why in an enum而言,它只是计算表达式的方式枚举允许表达式(和编译时对其进行评估)

+0

谢谢,但为什么?为什么轮班在枚举上离开操作? –

+0

@JoelMin,因为它是计算1,2,4的简单方法。使用'[Flags]'时,只需设置一个位。当你做'1 << 0'时,只有第0位被设置,当你做'1 << 2'时只有第2位被设置,等等。 –

+0

@ScottChamberlain解释得很好。希望你现在理解它! –