2011-04-09 40 views
17

我主要有一個C++背景,我正在學習C#。所以,我需要一些C#習語和風格的幫助。在C#中的方法中定義枚舉?

我想在C#中編寫一個小型文本文件解析方法,其中我需要一個具有三種狀態的簡單狀態變量。在C++中我將宣佈一個enum喜歡本作的狀態變量:

enum { stHeader, stBody, stFooter} state = stBody; 

...然後用它在我的解析循環是這樣的:

if (state == stHeader && input == ".endheader") 
{ 
    state = stBody; 
} 

在C#中我意識到,這是不可能在方法中聲明enum。那麼,爲了清潔的風格我應該怎麼做?聲明此方法以外的內部enum?使用魔術數字1,2,3?爲此創建一個單獨的類?

請幫我澄清一下我的困惑。

+0

也許我錯過了一些東西,但是如果僅在單一方法中使用枚舉的話,它有什麼意義呢? – Doggett 2011-04-09 09:03:49

+4

@Dogget - 爲狀態提供可讀的名稱。否則我將不得不寫if(state == 2 && input ==「.endheader」)state = 1; – danatel 2011-04-09 09:07:41

+2

狀態的自我註釋等。在C中,這是非常普遍的做法,即在給出的例子中 - 使狀態比int更有意義。我不得不說C#我不得不說 - 主要是因爲你傾向於將方法分解成更小的組件,對象等,而不是C,這是更重要的方向。或者C++在與C相似的情況下使用。 – Mania 2011-04-09 09:08:10

回答

25

你可以得到的最接近的是一個私人嵌套的枚舉與類:

public class TheClass 
{ 
    private enum TheEnum 
    { 
     stHeader, 
     stBody, 
     stFooter 
    } 

    // ...the rest of the methods properties etc... 
} 
+10

這是錯誤的,因爲各州在方法之外絕對沒有意義。這就像在方法之外聲明循環變量一樣。而且,你需要給它一個名字! – danatel 2011-04-09 08:53:36

+10

歡迎來到保守的企業語言的世界。它可能會更糟,但它可能是java:D – 2011-04-09 08:54:32

+1

@danatel:我不會制定規則:) – 2011-04-09 08:56:49

6

您也可以使用恆定的變數,但是我喜歡,我認爲是使用 枚舉更好的代碼風格

public class Class1 
{ 
    private enum TheEnum 
    { 
     stHeader, 
     stBody, 
     stFooter 
    } 
    public void SomeMethodEnum() 
    { 
     TheEnum state = TheEnum.stBody; 
     switch (state) 
     { 
      case TheEnum.stHeader: 
       //do something 
       break; 
      case TheEnum.stBody: 
       break; 
      case TheEnum.stFooter: 
       break; 
      default: 
       throw new ArgumentOutOfRangeException(); 
     } 
    } 


    public void SomeMethodConst() 
    { 
     int state = 1; 
     const int Header = 1; 
     const int Body = 2; 
     const int Footer = 3; 

     switch (state) 
     { 
      case Header: 
       break; 
      case Body: 
       break; 
      case Footer: 
       break; 
      default: 
       throw new ArgumentOutOfRangeException(); 
     } 

    } 
} 
0

我也贊成枚舉方法。此外,儘管這不是這種情況,但是當您想將它們作爲標誌組合時,它比CONSTS具有優勢,因爲您有一種方法可以輕鬆測試它。