Ruby 符号的 C# 等价物

Posted

技术标签:

【中文标题】Ruby 符号的 C# 等价物【英文标题】:C# equivalent of the Ruby symbol 【发布时间】: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 个符号不能具有相同的值。 【参考方案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。

以上是关于Ruby 符号的 C# 等价物的主要内容,如果未能解决你的问题,请参考以下文章

PHP 等价于 Ruby 符号

是否有与 Ruby 符号等效的 Python?

图标符号网格是不是有任何 Unicode 等价物?

用英语等价物替换德语字符(变音符号、重音符号)

扩展的 ASCII 字符,例如欧元符号被转换为其 unicode 等价物

C 语言数组与指针操作 ( 数组符号 [] 与 指针 * 符号 的 联系 与 区别 | 数组符号 [] 与 指针 * 符号 使用效果 基本等价 | 数组首地址 与 指针 本质区别 )