【问题标题】:C# equivalent of the Ruby symbolRuby 符号的 C# 等价物
【发布时间】:2011-01-21 19:17:54
【问题描述】:

为了好玩,我正在开发一个小的 C# 应用程序。我喜欢这种语言,但有些东西让我感到不安......

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

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

就我而言,我想向函数发送一个标志(连接或断开连接)。

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

这是我想做的:

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

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

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

【问题讨论】:

  • 可能值得您放入一个 C 或 Ruby 代码的小示例,以更好地准确地展示您希望如何将您的连接/断开连接标志放置到使用。
  • 感谢您添加。由于我不熟悉 Ruby,可以在运行时动态声明符号吗?这是我根据您在此处使用它们的方式得出的印象。
  • @Xiaofu Symbols 不需要声明,ruby 会在第一次读取它们时自动为它们赋值。如果代码中再次出现相同的符号,则重复使用相同的值。 2 个符号不能具有相同的值。

标签: c# ruby symbols


【解决方案1】:

在您的情况下,可以使用枚举来发送标志...

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

【讨论】:

    【解决方案2】:

    你可以使用字符串常量:

    public const string Guy = "guy";
    

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

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

    【讨论】:

    • 打印哈希码并不表明它们引用了同一个对象 - 请改用 object.ReferenceEquals。 (他们,由于文字实习 - 但你的代码实际上并没有证明这一点。)
    • 哈希码即使不指向同一个对象也会匹配。哈希码是根据字符串的内容计算的,而不是根据其内存位置计算的。而且我不会依赖被拘留的字符串。这仅适用于文字字符串,我会说这是一个实现细节。如果您想确定两个等效字符串确实是同一个对象,请使用string.Intern()
    【解决方案3】:

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

    如果您的标志用于条件编译,那么您仍然可以这样做:

    #define MY_FLAG
    
    #if MY_FLAG
      //do something
    #endif
    

    但如果不是,那么您所描述的是一个配置选项,可能应该存储在类变量或配置文件中,而不是宏中。

    【讨论】:

    • 是的,我知道这个方法,它几乎是优雅的:p 在 C 中,define 可以用于条件或函数参数。
    • 在我看来,用作方法替代或全局变量的宏往往会使情况变得模糊,而且模糊一点也不优雅。 ;) 当然,除此之外,您可能还有其他想法。
    • 看看你可以用红宝石符号做什么;)randomhacks.net/articles/2007/01/20/…
    【解决方案4】:

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

    【讨论】:

    • 常量默认是静态的,看看这个abdullin.com/how-to-run-free-ncover-on-a-64-bit-machine
    • 我认为 jmservera 是指将 class 标记为静态。 static class Defs{}
    • 有点离题,但你应该在计算中使用 Math.PI。我知道这只是一个示例,但可能会误导新程序员认为他们需要在其应用程序中定义 PI。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 2012-04-05
    • 1970-01-01
    相关资源
    最近更新 更多