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# 等价物的主要内容,如果未能解决你的问题,请参考以下文章
扩展的 ASCII 字符,例如欧元符号被转换为其 unicode 等价物
C 语言数组与指针操作 ( 数组符号 [] 与 指针 * 符号 的 联系 与 区别 | 数组符号 [] 与 指针 * 符号 使用效果 基本等价 | 数组首地址 与 指针 本质区别 )