2010-02-27 59 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