2010-09-03 7 views

Respuesta

5

Por lo general, utilizaría un const en toda su solución. Pero los beneficios de usarlo en un ámbito local, sería que conozca algún otro lugar en su alcance, no lo cambiará. Y también, si alguien más está trabajando en este código, sabrán que no debe cambiarlo también. Esto hace que su programa sea más fácil de mantener, ya que solo necesita mantener el const (aunque solo sea en un ámbito local)

3

Sí. Protegerá su código de cambiar accidentalmente esta variable.

2

Declarar el local como const le permitirá al compilador conocer su intención por lo que no podrá cambiar el valor de su variable en ningún otro lugar de su función.

1

Además de las respuestas válidas, no solo le dice al compilador que el valor no será cambiando, rápidamente le dice a alguien más que mirará su código.

+1

Declaro consts locales para otros programadores más que por cualquier otro motivo. –

0

Dependiendo caso de uso ..

Por ejemplo,

void Foo() 
{ 
    const string xpath = "//pattern/node"; 

    new XmlDocument().SelectNodes(xpath); 
} 

en este caso creo que la declaración const no tiene sentido

+1

Creo que esto todavía tiene valor, una de las razones es la coherencia. Si siempre usas la regla de configuración de ámbito local, es menos probable que la olvides en un lugar donde pueda ser más beneficiosa (no perder nada aquí al usarla, y de todos modos no es una gran cantidad de tipeo extra). Además, si esta función creciera en el futuro, no necesita preocuparse de que alguien cambie el valor más allá en el alcance sin darse cuenta de su intención inicial. – cweston

5

Declarar la variable const también permitirá que el compilador para hacer la optimización - en lugar de decir asignar un int en la pila y colocar su valor allí, el compilador puede simplemente usar el valor directamente con su código

ie El siguiente:

const int test = 4; 
DoSomething(test); 

Podría ser compilado como

DoSomething(4); 

por el compilador

Editar: Responder a "constante de propagación" como el apartado de comentarios tiene límite de tamaño

Uso ildasm para verificar entre const y none const para el lanzamiento con optimización:

El código

int test = 4; 
Console.WriteLine(test*2); 

compila en

.method private hidebysig static void Main(string[] args) cil managed 
{ 
    .entrypoint 
    // Code size  11 (0xb) 
    .maxstack 2 
    .locals init ([0] int32 test) 
    IL_0000: ldc.i4.4 
    IL_0001: stloc.0 
    IL_0002: ldloc.0 
    IL_0003: ldc.i4.2 
    IL_0004: mul 
    IL_0005: call  void [mscorlib]System.Console::WriteLine(int32) 
    IL_000a: ret 
} // end of method Program::Main 

Mientras

const int test = 4; 
Console.WriteLine(test*2); 

obtiene optimizado para

.method private hidebysig static void Main(string[] args) cil managed 
{ 
    .entrypoint 
    // Code size  7 (0x7) 
    .maxstack 8 
    IL_0000: ldc.i4.8 
    IL_0001: call  void [mscorlib]System.Console::WriteLine(int32) 
    IL_0006: ret 
} // end of method Program::Main 

Este es el uso de 2010 en r Elease con optimizaciones.

Hice una búsqueda para aprender más sobre la propagación constante y mientras Posible, el compilador actual no hacer esto como se mencionó here

+0

Incluso si no etiqueta su variable como const, el optimizador determinará fácilmente que su variable es una constante y luego producirá el código anterior. Se llama "propagación constante". – Roubachof

+0

@Roubachof No había oído hablar de "propagación constante" antes, gracias por el comentario. He editado mi respuesta con un enlace que encontré al leer sobre él; resulta que el compilador actual no lo hace, ¡tal vez en el futuro! (¡Una vez que hayan solucionado los errores actuales en 2010!) – JLWarlow

+0

realmente ?? esta es una técnica de optimización tan básica que estoy realmente sorprendido por esta noticia. ¡Buen trabajo! – Roubachof

3

me gusta hacer esto cuando estoy pasando un indicador indicador booleano a un método :

const bool includeFoo = true; 
int result = bar.Compute(10, includeFoo); 

Esto es más legible para mí que un simple verdadero/falso, que requiere leer la declaración del método para determinar el significado.

+1

Me gusta este Dan. Me he dado cuenta de que MS parece hacer esto en su código fuente: base.Compute (10, true/* includeFoo * /); que tiene la ventaja de permanecer en una línea. – Nik

+1

En C# 4.0, puede usar parámetros con nombre para lograr lo mismo (¡afortunadamente los parámetros tienen nombres razonables!) No es para lo que fueron presentados, pero tienen la ventaja de asegurarse de usar los nombres correctos (usando const locals o comentarios en una llamada con muchas banderas de ese tipo podría confundirlas accidentalmente). – shambulator

+1

Cuando diseño mis propias interfaces, tiendo a intentar evitar los parámetros booleanos en primer lugar y creo diferentes métodos públicos que se asignan a un método interno con una bandera o uso de valores enum para la bandera. Todavía encuentro útil esta técnica cuando se interopera con API que toman un booleano o parámetros 'mágicos' (como string.Empty para indicar 'missing'). –

Cuestiones relacionadas