¿Hay algún beneficio para declarar una variable local como "const" si sé que no modificaré su valor?¿Hay algún beneficio para declarar una constante en un ámbito local en C#?
Gracias,
¿Hay algún beneficio para declarar una variable local como "const" si sé que no modificaré su valor?¿Hay algún beneficio para declarar una constante en un ámbito local en C#?
Gracias,
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)
Sí. Protegerá su código de cambiar accidentalmente esta variable.
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.
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.
Declaro consts locales para otros programadores más que por cualquier otro motivo. –
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
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
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
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
@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
realmente ?? esta es una técnica de optimización tan básica que estoy realmente sorprendido por esta noticia. ¡Buen trabajo! – Roubachof
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.
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
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
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'). –
¿Hay algún beneficio en declarar constante como variable? – epitka