2011-09-19 71 views
14

今天,我遇到了一些類似這樣的代碼。定義類外部但名字空間內部的枚舉

namespace Foo 
{ 

    public enum Game{ High, Low}; 
    public enum Switch{On, Off}; 

    public class Bar() 
    { 
    // Blah 
    } 
} 

我找不出什麼區別,並聲明在類內的枚舉是。 AFAIK,你仍然可以「覆蓋」班級內的那些枚舉。

回答

21

枚舉類型,就像類一樣。當你在一個類中聲明一個枚舉時,它只是一個嵌套類型。一個嵌套枚舉隱藏其他具有相同名稱的枚舉在外部作用域中聲明,但仍然可以通過其完全限定名稱(使用名稱空間前綴,在您的示例中)引用隱藏的枚舉。

是否聲明頂級枚舉或嵌套枚舉的決定取決於您的設計以及這些枚舉是否將被類以外的任何其他類所使用。您也可以使嵌套枚舉爲private或protected爲其封閉類型。但是,頂級枚舉更常見。

+0

因此,正確的名稱是一個頂級枚舉? – surfasb

+0

我這麼認爲...你可以在這裏找到這些定義(http://msdn.microsoft.com/en-us/library/ba0a1yw2.aspx)。 –

4

如果你把枚舉類中,你需要在每次使用它的類之外的時間指定類名,例如:

SomeLongClassName x = new SomeLongClassName(SomeLongClassName.Game.High, SomeLongClassName.Switch.On); 

代替:

SomeLongClassName x = new SomeLongClassName(Game.High, Switch.On); 

如果僅在該類中使用ennumeration,那麼您可以決定將ennumeration放在類中,但是這種隔離只適用於類。如果你有一個僅由單一方法使用的枚舉,則不能將其放入方法中。