2010-02-27 167 views
7

我正在開發一個有趣的小C#應用程序。我喜歡這種語言,但有些事情會打擾我...C#等價的Ruby符號

有沒有辦法做一個#define(C模式)或符號(紅寶石模式)。

紅寶石符號是相當有用的。它只是一個以「:」開頭的名字(例如「guy」),每個符號都是唯一的,可以在代碼中的任何地方使用。

在我的情況下,我想發送一個標誌(連接或斷開)到一個函數。

什麼是最優雅的C#方式做到這一點?

這裏是我想要做什麼:

BgWorker.RunWorkersAsync(:connect) 
//... 

private void BgWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    if (e.Arguement == :connect) 
    //Do the job 
} 

在這一點上我最喜歡的答案是枚舉的解決方案;)

+0

這可能是值得你投入C或Ruby代碼的一個小例子來更好地展示_exactly_如何」 d喜歡把你的這個連接/斷開標誌使用。 – Xiaofu 2010-02-27 15:09:00

+0

感謝您的補充。由於我不熟悉Ruby,可以在運行時動態聲明符號嗎?這是我根據你在這裏使用它們的方式得到的印象。 – Xiaofu 2010-02-27 15:24:04

+0

@Xiaofu符號不需要聲明,紅寶石會自動爲它們分配一個值,當它第一次讀取它們時。如果代碼中再次出現相同的相同符號,則重複使用相同的值。 2個符號不能具有相同的值。 – 2010-02-27 15:31:44

回答

6

在你的情況,發送標誌可以通過使用枚舉來完成...

public enum Message 
{ 
    Connect, 
    Disconnect 
} 

public void Action(Message msg) 
{ 
    switch(msg) 
    { 
     case Message.Connect: 
     //do connect here 
     break; 
     case Message.Disconnect: 
      //disconnect 
     break; 
     default: 
      //Fail! 
     break; 
    } 
} 
3

你可以使用一個字符串常量:

public const string Guy = "guy"; 

事實上,.NET中的字符串是特殊的。如果你聲明瞭兩個字符串變量具有相同價值,他們實際上指向同一個對象:

string a = "guy"; 
string b = "guy"; 
Console.WriteLine(object.ReferenceEquals(a, b)); // prints True 
+8

打印哈希碼不會顯示它們引用的是同一個對象 - 請改爲使用object.ReferenceEquals。 (他們*將*,由於文字實習 - 但你的代碼實際上並不能證明它。) – 2010-02-27 14:43:29

+1

即使他們不指向同一個對象,哈希代碼也會匹配。哈希碼是從字符串的內容中計算出來的,而不是從內存位置計算出來的。而且我不會依賴於被實習的字符串。這隻適用於字面字符串,我會說它是一個實現細節。如果你想確定兩個等價的字符串確實是同一個對象,可以使用'string.Intern()'。 – 2010-02-27 15:21:15

+0

感謝Jon,我更新了帖子以反映您的評論。 – 2010-02-27 15:22:39

0

到@Darin類似,但我經常在我的項目把所有這些常量創建DEFS類,所以有一個簡單的方法從任何地方訪問它們。

class Program 
{ 
    static void Main(string[] args) 
    { 

     string s = Defs.pi; 
    } 
} 
class Defs 
{ 

    public const int Val = 5; 
    public const string pi = "3.1459"; 
} 
+1

記得要將Defs標記爲靜態! – jmservera 2010-02-27 14:50:32

+0

Const默認是靜態的請看這個http://abdullin.com/how-to-run-free-ncover-on-a-64-bit-machine/ – rerun 2010-02-27 15:00:03

+1

我認爲jmservera指的是標記* class *爲靜態。 'static class Defs {}' – 2010-02-27 15:17:10

2

C#不支持C風格的宏,雖然它仍然有#define。對於他們的推理,請看看msdn上的csharp FAQ blog

如果你的標誌是對條件編譯的目的,那麼你仍然可以做到這一點:

#define MY_FLAG 

#if MY_FLAG 
    //do something 
#endif 

但如果不是,那麼是什麼你所描述的是一個配置選項,也許應該存儲在一個類變量或配置文件而不是宏。

+0

是的,我知道這個方法,它幾乎沒有優雅:p在C中,define可以用於條件或作爲函數參數。 – 2010-02-27 14:58:22

+0

在我看來,用作方法替代或全局變量的宏往往掩蓋了這種情況,而隱含的東西不過是優雅的。 ;)但當然,除此之外,你可能還有其他的想法。 – Xiaofu 2010-02-27 15:03:22

+0

看看你能用紅寶石符號做什麼;)http://www.randomhacks.net/articles/2007/01/20/13-ways-of-looking-at-a-ruby-symbol – 2010-02-27 15:07:51