2010-02-27 37 views
7

Estoy desarrollando una pequeña aplicación C# para la diversión. Me encanta este lenguaje, pero algo me molesta ...C# equivalente al símbolo Ruby

¿Hay alguna manera de hacer un #define (modo C) o un símbolo (modo ruby).

El símbolo de rubí es bastante útil. Es solo un nombre precedido por un ":" (ejemplo: "chico") cada símbolo es único y puede usarse en cualquier parte del código.

En mi caso, me gustaría enviar una bandera (conectar o desconectar) a una función.

¿Cuál es la manera más elegante de C# para hacer eso?

Esto es lo que me gustaría hacer:

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

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

En este punto el mi respuesta favorita es la solución enumeración;)

+0

Podría ser que valga la pena poner en un pequeño ejemplo de C o código Ruby para demostrar mejor cómo _exactly_' Me gustaría poner esta bandera de conexión/desconexión para usar. – Xiaofu

+0

Gracias por agregar eso. Como no estoy familiarizado con Ruby, ¿pueden los símbolos declararse dinámicamente en tiempo de ejecución? Esa es la impresión que tengo en función de cómo te gustaría usarlos aquí. – Xiaofu

+0

@Xiaofu Símbolos no necesitan ser declarados, ruby ​​automáticamente les asignará un valor cuando los lea por primera vez. El mismo valor se reutiliza si el mismo mismo símbolo aparece nuevamente en el código. 2 símbolos no pueden tener el mismo valor. –

Respuesta

6

En su caso, el envío de una bandera se puede hacer mediante el uso de una enumeración ...

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; 
    } 
} 
3

se puede utilizar una constante de cadena:

public const string Guy = "guy"; 

De hecho, las cadenas en .NET son especiales. Si se declara dos variables de cadena con el mismo valor que en realidad apuntan al mismo objeto:

string a = "guy"; 
string b = "guy"; 
Console.WriteLine(object.ReferenceEquals(a, b)); // prints True 
+8

Imprimir el código hash no muestra que están haciendo referencia al mismo objeto - use object.ReferenceEquals en su lugar. (They * will *, debido al internamiento literal, pero su código en realidad no lo prueba). –

+1

El código hash coincidirá incluso si no apuntan al mismo objeto. El código hash se calcula a partir del contenido de la cadena, no desde su ubicación de memoria. Y no confiaría en que las cuerdas sean internados. Esto es solo para cadenas literales y yo diría que es un detalle de implementación. Si quiere estar seguro de que dos cadenas equivalentes son de hecho el mismo objeto, use 'string.Intern()'. –

+0

Gracias Jon, he actualizado la publicación para reflejar tu comentario. –

0

similares a @Darin pero a menudo crea una clase Def en mi proyecto para poner todas esas constantes por lo que hay una manera fácil para acceder a ellos desde cualquier lugar

class Program 
{ 
    static void Main(string[] args) 
    { 

     string s = Defs.pi; 
    } 
} 
class Defs 
{ 

    public const int Val = 5; 
    public const string pi = "3.1459"; 
} 
+1

¡Recuerde marcar Defs como estático! – jmservera

+0

Const son estáticos por defecto eche un vistazo a este http://abdullin.com/how-to-run-free-ncover-on-a-64-bit-machine/ – rerun

+1

Creo que jmservera se refiere a marcar la clase * * como estático. 'static class Defs {}' –

2

C# no es compatible con las macros de tipo C, aunque tiene todavía #define. Para su razonamiento sobre esto, eche un vistazo al csharp FAQ blog en msdn.

Si su bandera es para fines de compilación condicional, entonces todavía se puede hacer esto:

#define MY_FLAG 

#if MY_FLAG 
    //do something 
#endif 

Pero si no es así, entonces lo que usted está describiendo es una opción de configuración y tal vez se debe almacenar en una variable de clase o archivo de configuración en lugar de una macro.

+0

Sí, conozco este método, es todo menos elegante: p En C, la definición puede usarse en condición o como parámetros de función. –

+0

Las macros utilizadas como sustitutos del método o como variables globales tienden a oscurecer la situación en mi opinión, y la oscuridad no es nada elegante. ;) Pero, por supuesto, es posible que tenga otras cosas en mente más allá de eso. – Xiaofu

+0

Mire lo que puede hacer con los símbolos de rubí;) http://www.randomhacks.net/articles/2007/01/20/13-ways-of-looking-at-a-ruby-symbol –