2010-03-28 13 views
12

¿Alguien puede decir cuál es el punto de una constante en C#?¿Cuál es el punto de una constante en C#

Por ejemplo, ¿cuál es la ventaja de hacer

const int months = 12; 

en contraposición a

int months = 12; 

consigo que las constantes no se pueden cambiar, pero entonces ¿por qué no ... no cambio es valor después de que lo inicialices?

+12

¿por qué tener métodos privados cuando solo puede hacer que todo sea público y solo llame a los necesarios? – zxcvbnm

+0

Cuanto más pueda comunicar su * intención * en su código, cuanto más pueda verificar el compilador por usted, más fácil le resultará a otros leerlo y comprenderlo. También hay alguna optimización potencial adicional que puede hacer el compilador. –

Respuesta

3

Tenga en cuenta que puede no ser la única persona que usa el valor. No solo no puedes cambiarlo, sino que nadie que use tu código (como una biblioteca, por ejemplo) puede cambiarlo.

Y marcándolo como constante también hace que su intento sea claro.

2

Eso es todo. Le dices al compilador que nunca puede cambiar, y el compilador puede optimizar mucho mejor sabiendo que es inmutable.

14

La diferencia entre "no se puede cambiar" y "no va a cambiar" en realidad sólo se hace evidente cuando una de las siguientes situaciones obtiene:

  • otros desarrolladores comienzan a trabajar en su código,
  • tercer -partes comienzan usando su código, o
  • un año pasa y usted vuelve a ese código.

Cuando se habla de accesibilidad a los datos surgen preguntas muy similares. La idea es que usted quiera que su código brinde tanta flexibilidad como lo desee, porque de lo contrario alguien (posiblemente usted) vendrá y hará algo que no pretendía, ¡lo que lleva a errores!

+1

Estoy de acuerdo con sus comentarios, pero olvidó incluir quizás la razón más importante para la existencia de "const": permite al compilador optimizar el programa. – user88637

+3

En realidad, yo diría que el rendimiento es la * peor * razón para usar 'const'. (Lo que no quiere decir que no valga la pena sacrificar la facilidad de mantenimiento para micro-optimizaciones en un pequeño porcentaje de casos). – ladenedge

1

Por varias razones:

  1. se quiere diferenciar ciertos valores que tengan cierto significado a partir de otras variables.
  2. Puede olvidar más tarde que no está destinado a cambiar un valor y provocar un comportamiento imprevisto.
  3. Su código puede ser utilizado por otras personas y pueden cambiarlo (especialmente si está desarrollando una biblioteca o una API).
  4. Porque todo lo que puede salir mal por lo general lo hará, así que evítelo detectando estos errores en tiempo de compilación en lugar de en tiempo de ejecución.
-1

Uno de la regla de que muchos programadores siguen es: Nunca difícil que el código cualquier variable/excepto 0. Eso significa que, en lugar de hacer

for(int i=0; i<100; i++) {} 

debe hacer

const loopCount = 100; 
.... 
for (int i=0; i<loopCount; i++) {} 

I Creo que usar const es una buena razón para reemplazar esto. Y, de hecho, hay mucho más razón para esto:

  1. Optimizar para el compilador - memoria, rendimiento.
  2. Dígale al programador que siga su trabajo, esto es CONSTANTE
  3. Si necesita refactorizar, cambie de opinión en el número, ya sabe a dónde ir. Y asegúrese de que ningún otro lugar en el código pueda cambiar esto.
+3

¿No debería ser 'for (int i = 0; i Gabe

+6

Para que quede claro, xandy, todavía has codificado el valor de la variable. Acabas de hacerlo en un lugar que está muy lejos de donde el valor es relevante, lo que posiblemente podría ser molesto. Seguir ciegamente una regla como "no codificar, excepto en las constantes" a veces puede ser peor que no seguirla en absoluto. – ladenedge

2

utilizando constantes programadores tienen la ventaja de legibilidad sobre el valor real como

const double PI = 3.14159; 

También acelera el cálculo en comparación con las variables mediante la inserción de los valores en tiempo de compilación y no ser inferido a partir de un registro de posiciones/memoria.

+9

Pi es un int? :-) – Ken

+0

@kanchirk: Allí, lo corrigí por ti. – missingfaktor

+0

@Rahul G/@Ken Gracias #lol – kanchirk

0

El "punto" es para que pueda usar una sola variable de todo el programa y tener solo un lugar para cambiarla.

Imagina si estuvieras haciendo un videojuego que dependiera de conocer el FPS (cuadros por segundo) en 100 archivos de código diferentes. Así que imagina que el FPS tenía 50 ... y que tenías el número "50" en todos esos archivos y funciones ... entonces te das cuenta de que querías hacerlo a 60 FPS ... en lugar de cambiar esos 100 archivos, solo lo harías cambie esto:

const int FRAMES_PER_SECOND = 60; 

y en esos archivos/funciones, usted usaría la variable FRAMES_PER_SECOND.

Por cierto, esto no tiene nada que ver con C# ... las constantes están en toneladas de idiomas.

+0

Estás hablando de variables globales, no de variables 'const'. Podría hacer exactamente lo que sugirió sin utilizar la palabra clave 'const'. –

+1

Sí, excepto marcarlo, const informa al compilador y al desarrollador que el valor se define una vez, y no es algo que se pueda cambiar con el tiempo. – kyoryu

30

Si el compilador sabe que un valor es constante y nunca cambiará, puede compilar el valor directamente en su programa.

Si declara que pi es una constante, cada vez que vea pi/2 el compilador puede hacer el cálculo e insertar 1.57 ... directamente en el código compilado. Si declara pi como una variable, cada vez que su programa use pi/2, la computadora tendrá que hacer referencia a la variable pi y multiplicarla por 0.5, lo que obviamente es más lento.

También debería agregar que C# tiene readonly que es para valores que el compilador no puede calcular, pero que no pueden cambiar durante la ejecución de su programa. Por ejemplo, si desea una constante ProgramStartTime, deberá declararla readonly DateTime ProgramStartTime = DateTime.Now porque debe evaluarse cuando se inicia el programa.

Por último, se puede crear una propiedad de sólo lectura, dándole un captador pero ningún organismo, como esto:

int Months { get { return 12; } } pero al ser una propiedad que no tiene que tener el mismo valor cada vez que lo leas , de esta manera:

int DaysInFebruary { get { return IsLeapYear ? 29 : 28 } }

+1

+1 para "directamente en el código compilado". –

+1

Curiosamente, puede modificar los campos 'readonly' utilizando reflection :) – Juliet

+2

La elección const/readonly tiene implicaciones de control de versiones. –

0

es un caso de estar explícito de su intención.

Si tiene intención de cambiar el valor, entonces no use 'const'. Si no tiene la intención de cambiar el valor, entonces use 'const'.

De esta forma, tanto el compilador como el tercero (o usted mismo si lee su código después de mucho tiempo) pueden saber lo que usted desea. Si usted o alguien comete un error al cambiar el valor, el compilador puede detectarlo.

Y de todos modos, para utilizar 'const' no es obligatorio.Si cree que puede manejar la "constancia" usted mismo (sin querer que el compilador detecte un error), entonces no use "const" ;-).

1

Declarar un valor 'const' pone en juego el compilador para ayudarlo a imponer disciplina personal, al no permitir ningún cambio en ese valor.

Además, detectará errores inesperados debido a los efectos secundarios de pasar un valor (que intenta tratar como una constante) a un método que toma un parámetro 'ref' y podría alterar el valor inesperadamente.

7

Si nunca comete errores, nadie en el equipo con el que trabaja comete errores, nunca olvida el propósito exacto de una variable que ha definido incluso después de volver al código que no ha mirado en meses o años , y usted y todas las personas con las que trabaja reconocen, entienden y siguen 100% su intención de no cambiar nunca el valor de una constante cuando no se haya molestado en usar una construcción de lenguaje incorporada que indique y refuerce la constness, entonces no, hay No tiene sentido.

Si alguna de esas cosas alguna vez resulta no ser el caso, ese es el punto.

En cuanto a mí, me parece que incluso cuando estoy más lúcido, recordar más de siete cosas a la vez es casi imposible, así que tomaré toda la ayuda que pueda para evitar errores, especialmente cuando el costo es una sola palabra clave. Si eres más inteligente que yo y nunca tienes que trabajar en un equipo con alguien menos inteligente que tú, haz lo que quieras.

En algunos casos, puede haber algunas optimizaciones del compilador que se pueden realizar en función de la constness (plegado constante, para uno, que colapsa expresiones que constan de constantes en tiempo de compilación). Pero generalmente, ese no es el punto.

+1

Eso suena como un equipo divertido. También es barato, ya que no necesitas Visual Studio: para el depurador, simplemente escribes el código una vez en el bloc de notas (y dejas que la secretaria maneje los errores ortográficos de comentarios);) Los programadores reales no necesitan IDE. – TomTom

+0

+1 por increíble sarcasmo – Darcy

0

Debe definir una variable como "const" cuando sepa que el valor de esto se mantendrá constante a través de su aplicación. Entonces, una vez que define un const, su valor debe ser determinable en el momento de la compilación y este valor se guardará en los metadatos del ensamblaje. Algunos puntos más importantes en Const:

  1. Un const se puede definir solo para los tipos que su compilador trata como tipos principales.
  2. Las constantes siempre se consideran como parte del tipo de definición.
  3. Siempre se consideran miembros estáticos.
  4. El valor de las constantes siempre se incrustan directamente en el código, por lo que las constantes no requieren que se les asigne ninguna memoria en tiempo de ejecución.

Debido a esta incrustación del valor en metadatos, cuando alguien cambie el valor de la const (en el montaje donde se define la const) debido a versiones o algún otro requisito entonces el usuario de la DLL tiene que recompilar su propia asamblea. Y este problema se puede evitar con la palabra clave "readonly".

1

Estrictamente hablando, "const" no es necesario. Python, por ejemplo, no tiene "const" ni "private"; usted especifica su intención con la convención de nomenclatura de THIS_IS_A_CONSTANT y _this_is_private.

C#, sin embargo, tiene una filosofía de diseño de detectar errores en tiempo de compilación en lugar de tiempo de ejecución.

1

Todo sobre la legibilidad, la semántica diferente para el programador es verdad y usted debe saberlo todo.

Pero las constantes en C# (más bien en.net) tiene una semántica muy diferente (en términos de implementación) en comparación con las variables ordinarias.

Como un valor constante nunca cambia, las constantes siempre se consideran parte del tipo de definición . En otras palabras, las constantes siempre se consideran miembros estáticos, no miembros de instancias. La definición de una constante provoca la creación de metadatos. Cuando el código se refiere a un símbolo constante, los compiladores incrustan el valor en el código de Lenguaje Intermedio (IL) emitido.

Estas restricciones significan que las constantes no tienen una buena historia de versiones de ensamblaje cruzado, por lo que debe usarlas solo cuando sepa que el valor de un símbolo nunca cambiará.