C#中等价于Ruby符号的内容

9
我正在开发一个小型的C#应用程序,纯属娱乐。我喜欢这种语言,但有些东西让我感到困扰...
是否有任何方式可以进行#define(C模式)或符号(ruby模式)。
Ruby符号非常有用。它只是一个以“:”为前缀的名称(例如“:guy”),每个符号都是唯一的,并且可以在代码中的任何位置使用。
在我的情况下,我想向函数发送一个标志(连接或断开连接)。
什么是最优雅的C#方法?
以下是我想要做的事情:
BgWorker.RunWorkersAsync(:connect)
//...

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

目前我最喜欢的答案是枚举解决方案 ;)


也许值得你花点时间放入一小段C或Ruby代码示例,以更好地演示您想要如何使用这个连接/断开标志。 - Xiaofu
谢谢你的补充。由于我不熟悉Ruby,符号是否可以在运行时动态声明?根据你想在这里使用它们的方式,我得到了这样的印象。 - Xiaofu
1
@小富,符号不需要声明,Ruby在第一次读取它们时会自动为它们分配一个值。如果同一个符号再次出现在代码中,则重用相同的值。两个符号不能具有相同的值。 - Nicolas Guillaume
4个回答

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;
   }
}

4
您可以使用字符串常量:
```

您可以使用字符串常量:

```
public const string Guy = "guy";

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

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

9
打印哈希码并不表示它们引用了相同的对象,应该使用object.ReferenceEquals来检查。虽然它们由于字面值合并而引用相同的对象,但你的代码并没有真正证明这一点。 - Jon Skeet
1
哈希码将匹配,即使它们不指向同一个对象。哈希码是从字符串的内容计算出来的,而不是从其内存位置计算出来的。我不会依赖于字符串被整理。这仅适用于字面字符串,并且我认为这是一项实现细节。如果您想确保两个等效的字符串确实是相同的对象,请使用string.Intern() - P Daddy

2

C#不支持C风格的宏定义,但仍然有#define。关于此问题的原因,请参阅msdn上的csharp FAQ博客

如果您的标记是为了条件编译目的,那么您仍然可以这样做:

#define MY_FLAG

#if MY_FLAG
  //do something
#endif

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

是的,我知道这种方法,但它并不优雅 :p 在C语言中,define可以用作条件或函数参数。 - Nicolas Guillaume
在我看来,用作方法替代品或全局变量的宏会使情况变得模糊不清,而模糊不清绝非优雅之举。;) 当然,你可能有其他想法。 - Xiaofu
看看你可以用 Ruby 符号做什么 ;) http://www.randomhacks.net/articles/2007/01/20/13-ways-of-looking-at-a-ruby-symbol - Nicolas Guillaume

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";
} 

常量默认是静态的,请查看此链接:http://abdullin.com/how-to-run-free-ncover-on-a-64-bit-machine/。 - rerun
1
我认为jmservera是在指静态地标记static class Defs{} - P Daddy
1
有点跑题,但在计算中应该使用Math.PI。我知道这只是一个例子,但可能会误导新程序员认为他们需要在应用程序中定义PI。 - Maggie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接