2011-05-30 41 views
6

寻找在C#代码优化,让我都定义了一个枚举,并同时放创建枚举的类型的变量:在C#中,是否有办法在同一时间定义枚举和该枚举的实例?

前:

enum State {State1, State2, State3}; 
    State state = State.State1; 

后(不工作):

enum State {State1, State2, State3} state; 
    state = State.State1; 

这样的事情是否存在?

+0

即使有这样一种方式,它也不会再被优化。 'enum State {State1,State2,State3}'不会在运行时花费任何东西。 – 2011-05-30 14:59:48

回答

8

在C#中没有对此的支持,但是也许可以通过使用元组或匿名类型对枚举进行“近”处理,如果您只需切换某个状态而不需要执行任何操作它的特殊操作。

例如,使用元组,你可以这样做:

var someFakeEnum = Tuple.Create(0, 1);

UPDATE

C#7已经推出句法元组:

var someFakeEnum = (State1: 0, State2: 1); 

或具有匿名类型:

var someFakeEnum = new { State1 = 0, State2 = 1 };

而且,在这之后,你可以这样做:

int state = 0; 

// If you're using tuples... 
if(some condition) 
{ 
    state = someFakeEnum.Item2; 
} 

// ...or if you're using anonymous types or C# >= 7 tuples... 
if(some condition) 
{ 
    state = someFakeEnum.State2; 
} 

显然,这不是一个实际的枚举,你没有那个枚举类型为您提供的糖,但你仍然可以使用二元运算符,如OR,AND或其他实际枚举的条件。

+0

我不知道为什么有时候我们会得到降低成本O_o – 2015-01-09 11:05:24

+0

它不适用于'switch',因为它不是恒定的。也'var someFakeEnum = {State1 = 0,State2 = 1};'不起作用,那里应该有一个'新'。 – Haocheng 2015-03-29 13:39:18

+0

@Haocheng固定。我删除了'switch'部分。那是错的。 – 2015-03-29 14:01:31

1

不,不存在。也不是很可读恕我直言

+0

我从来没有在C/C++中遇到过问题。在C#中,它看起来很不寻常 – Dyppl 2011-05-30 14:58:39

2

从C/C++切换,我想?

不,不能这样做

6

这不是一个优化。

不,没有这样的东西存在,并有充分的理由。它的可读性要低得多,并且绝对有这样做的好处。用两个单独的声明来声明它们并且完成它。

如果你从字面上得到报酬,以减少你的源代码行数,就这样写:

enum State {State1, State2, State 3}; State state = State.State1; 

(是的,这是一个笑话居多。)

+2

我不知道有多少可怕的代码,我通过在我的建议中对初学程序员进行讽刺而间接产生了.. – Dyppl 2011-05-30 15:06:08

+1

当使用枚举非常有限,例如定义方法参数时,内联枚举实际上很有用,它只接受很少的状态,并且真的没有必要在命名空间中使用专用的枚举类型。这可以在C#6.0中更好地实现,从而简化静态成员的使用。 – orad 2015-01-29 00:07:20

0

不,在C#中,声明或类型以及使用该类型声明变量是分开的。

在C/C++中,通常直接声明和使用类型,例如struct关键字。在C#中它们是分开的。

注意,在C#中你不需要申报的enum(或classstruct)后的分号:

enum State { State1, State2, State3 } 

它仍然允许虽然,想必是用C多一点兼容/ C++语法。