2014-02-14 51 views
1

我真的錯過了C#中的C #define;在C##define參考說:有沒有一種方法如何使用常量沒有範圍解決?

#define指令不能被用於聲明恆定值是 通常在C和C++進行。 C#中的常量最好定義爲 類或結構的靜態成員。如果您有幾個這樣的常量,請考慮創建一個單獨的「常量」類來保存它們的 。

所以我想有這樣的事情:

class Constants { 
    public static const int UP=0, DOWN=1, LEFT=2, RIGHT=3; 
    ... 
} 

class Foo { 
    public Foo(int dir) { 
    // import Constants scope here (and some other classes) somehow 
    if(dir==UP) ... 
    // ...because this is far worse readable 
    if(dir==Constants.UP) 
    } 
} 

這可能嗎?如果是,如何?

+0

你試圖完成什麼?在我看來,枚舉值是你想要使用的而不是常量。看看Enum,而不是我的建議 – Sandman

+0

類名'Directions'會使它更具可讀性。實際上,爲不同目的創建幾個常量類(或枚舉)可能是一個好主意 – Andrei

回答

2

我建議你不要使用這種通用詞如常量類持有所有常數。因爲它沒有給你任何常量上下文。而且我不建議將所有的常量保存在一個類中。爲每組相關常量創建小的上下文。並給每個小環境適當的名稱。

有一種很好的方法可以在一個上下文中對相關的命名常量進行分組 - 枚舉。因此,對於你的方向常量創建枚舉和該枚舉給予描述性的名稱:

public enum MoveDirection 
{ 
    Up, 
    Down, 
    Left, 
    Right 
} 

現在UpPixar Movie - 它的移動方向:

switch(direction) 
{ 
    case MoveDirection.Up: 
     // ... 
} 
+1

Damnit Sergey!你先到那裏了! – JonE

+0

這就是我試圖避免的:很難閱讀'direction3D [MoveDirection.UP] [MoveDirection.LEFT] [MoveDirection.LEFT]',比較它到'direction3D [UP] [LEFT] [LEFT]' –

+0

@JanTuroň我想我的問題需要更多的背景。你使用哪種數據類型,以及UP和LEFT的真正含義。我會建議它是XY,YZ和XZ飛機的運動方向。但是在XY上的上移意味着與在YZ上的右上的移動完全相同 –

0

將這個對你的代碼的頂部:

using UP = Constants.UP; 

,那麼你就可以使用

if (dir == UP) ... 
+0

這看起來很好,但是當我嘗試編碼時會出錯。你能舉一些例子嗎? –

+0

錯誤是* Constants.UP是一個'字段',但用於'類型'* –

相關問題