2011-05-30 21 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++語法。