C#相当于Ruby符号

时间:2010-02-27 14:33:48

标签: c# ruby symbols

我正在开发一个小C#应用程序以获得乐趣。我喜欢这种语言,但有些东西打扰了我...

有没有办法做#define(C模式)或符号(ruby模式)。

红宝石符号非常有用。它只是一个以“:”开头的名称(例如“:guy”),每个符号都是唯一的,可以在代码中的任何位置使用。

在我的情况下,我想向一个函数发送一个标志(连接或断开连接)。

最优雅的C#方式是什么?

这是我想做的事情:

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

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

此时我最喜欢的答案是枚举解决方案;)

4 个答案:

答案 0 :(得分: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;
   }
}

答案 1 :(得分:4)

您可以使用字符串常量:

public const string Guy = "guy";

事实上,.NET中的字符串很特殊。如果声明两个具有相同值的字符串变量,它们实际上指向同一个对象:

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

答案 2 :(得分:2)

C#不支持C风格的宏,尽管它仍然有#define。有关这方面的推理,请查看msdn上的csharp FAQ blog

如果您的标志是用于条件编译目的,那么您仍然可以执行此操作:

#define MY_FLAG

#if MY_FLAG
  //do something
#endif

但如果没有,那么你所描述的是配置选项,也许应该存储在类变量或配置文件而不是宏中。

答案 3 :(得分: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";
}