C # эквивалент символа Ruby - PullRequest
8 голосов
/ 27 февраля 2010

Я разрабатываю небольшое приложение на C # для удовольствия. Я люблю этот язык, но что-то беспокоит меня ...

Есть ли способ сделать #define (режим C) или символ (режим ruby).

Символ рубина весьма полезен. Это просто какое-то имя, которому предшествует ":" (пример ": guy"), каждый символ уникален и может использоваться в любом месте кода.

В моем случае я бы хотел отправить флаг (подключить или отключить) к функции.

Какой самый элегантный способ C # сделать это?

Вот что я хотел бы сделать:

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

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

На данный момент мой любимый ответ - решение enum;)

Ответы [ 4 ]

6 голосов
/ 27 февраля 2010

В вашем случае отправка флага может быть выполнена с помощью enum ...

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;
   }
}
4 голосов
/ 27 февраля 2010

Вы можете использовать строковую константу:

public const string Guy = "guy";

На самом деле строки в .NET являются особыми. Если вы объявляете две строковые переменные с одинаковым значением, они фактически указывают на один и тот же объект:

string a = "guy";
string b = "guy";
Console.WriteLine(object.ReferenceEquals(a, b)); // prints True
2 голосов
/ 27 февраля 2010

C # не поддерживает макросы в стиле C, хотя у него все еще есть #define. Для объяснения этого взгляните на блог csharp FAQ на msdn.

Если ваш флаг предназначен для целей условной компиляции, вы все равно можете сделать это:

#define MY_FLAG

#if MY_FLAG
  //do something
#endif

Но если нет, то то, что вы описываете, является параметром конфигурации и, возможно, должно храниться в переменной класса или файле конфигурации вместо макроса.

0 голосов
/ 27 февраля 2010

Аналогично @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";
} 
...