C#等价的Ruby符号
我正在开发一个有趣的小C#应用程序。我喜欢这种语言,但有些事情会打扰我...C#等价的Ruby符号
有没有办法做一个#define(C模式)或符号(红宝石模式)。
红宝石符号是相当有用的。它只是一个以“:”开头的名字(例如“guy”),每个符号都是唯一的,可以在代码中的任何地方使用。
在我的情况下,我想发送一个标志(连接或断开)到一个函数。
什么是最优雅的C#方式做到这一点?
这里是我想要做什么:
BgWorker.RunWorkersAsync(:connect)
//...
private void BgWorker_DoWork(object sender, DoWorkEventArgs e)
{
if (e.Arguement == :connect)
//Do the job
}
在这一点上我最喜欢的答案是枚举的解决方案;)
在你的情况,发送标志可以通过使用枚举来完成...
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;
}
}
你可以使用一个字符串常量:
public const string Guy = "guy";
事实上,.NET中的字符串是特殊的。如果你声明了两个字符串变量具有相同价值,他们实际上指向同一个对象:
string a = "guy";
string b = "guy";
Console.WriteLine(object.ReferenceEquals(a, b)); // prints True
打印哈希码不会显示它们引用的是同一个对象 - 请改为使用object.ReferenceEquals。 (他们*将*,由于文字实习 - 但你的代码实际上并不能证明它。) – 2010-02-27 14:43:29
即使他们不指向同一个对象,哈希代码也会匹配。哈希码是从字符串的内容中计算出来的,而不是从内存位置计算出来的。而且我不会依赖于被实习的字符串。这只适用于字面字符串,我会说它是一个实现细节。如果你想确定两个等价的字符串确实是同一个对象,可以使用'string.Intern()'。 – 2010-02-27 15:21:15
感谢Jon,我更新了帖子以反映您的评论。 – 2010-02-27 15:22:39
到@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";
}
C#不支持C风格的宏,虽然它仍然有#define。对于他们的推理,请看看msdn上的csharp FAQ blog。
如果你的标志是对条件编译的目的,那么你仍然可以做到这一点:
#define MY_FLAG
#if MY_FLAG
//do something
#endif
但如果不是,那么是什么你所描述的是一个配置选项,也许应该存储在一个类变量或配置文件而不是宏。
是的,我知道这个方法,它几乎没有优雅:p在C中,define可以用于条件或作为函数参数。 – 2010-02-27 14:58:22
在我看来,用作方法替代或全局变量的宏往往掩盖了这种情况,而隐含的东西不过是优雅的。 ;)但当然,除此之外,你可能还有其他的想法。 – Xiaofu 2010-02-27 15:03:22
看看你能用红宝石符号做什么;)http://www.randomhacks.net/articles/2007/01/20/13-ways-of-looking-at-a-ruby-symbol – 2010-02-27 15:07:51
这可能是值得你投入C或Ruby代码的一个小例子来更好地展示_exactly_如何” d喜欢把你的这个连接/断开标志使用。 – Xiaofu 2010-02-27 15:09:00
感谢您的补充。由于我不熟悉Ruby,可以在运行时动态声明符号吗?这是我根据你在这里使用它们的方式得到的印象。 – Xiaofu 2010-02-27 15:24:04
@Xiaofu符号不需要声明,红宝石会自动为它们分配一个值,当它第一次读取它们时。如果代码中再次出现相同的相同符号,则重复使用相同的值。 2个符号不能具有相同的值。 – 2010-02-27 15:31:44