我正在开发一个小C#应用程序以获得乐趣。我喜欢这种语言,但有些东西打扰了我...
有没有办法做#define(C模式)或符号(ruby模式)。
红宝石符号非常有用。它只是一个以“:”开头的名称(例如“:guy”),每个符号都是唯一的,可以在代码中的任何位置使用。
在我的情况下,我想向一个函数发送一个标志(连接或断开连接)。
最优雅的C#方式是什么?
这是我想做的事情:
BgWorker.RunWorkersAsync(:connect)
//...
private void BgWorker_DoWork(object sender, DoWorkEventArgs e)
{
if (e.Arguement == :connect)
//Do the job
}
此时我最喜欢的答案是枚举解决方案;)
答案 0 :(得分: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;
}
}
答案 1 :(得分:4)
您可以使用字符串常量:
public const string Guy = "guy";
事实上,.NET中的字符串很特殊。如果声明两个具有相同值的字符串变量,它们实际上指向同一个对象:
string a = "guy";
string b = "guy";
Console.WriteLine(object.ReferenceEquals(a, b)); // prints True
答案 2 :(得分:2)
C#不支持C风格的宏,尽管它仍然有#define。有关这方面的推理,请查看msdn上的csharp FAQ blog。
如果您的标志是用于条件编译目的,那么您仍然可以执行此操作:
#define MY_FLAG
#if MY_FLAG
//do something
#endif
但如果没有,那么你所描述的是配置选项,也许应该存储在类变量或配置文件而不是宏中。
答案 3 :(得分: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";
}