2010-03-25 139 views
21

Estoy ansioso por saber la diferencia entre una variable const y una variable estática.¿Cuál es la diferencia entre Const y Static en C#?

Por lo que yo sé, un const también es estático y no se puede acceder en la variable de instancia que es igual a la estática, entonces, ¿cuál es la diferencia entre ellos?

Por favor explique ...

+9

No hay tal cosa const variable. –

Respuesta

29

const los campos solo pueden contener tipos de valores o System.String. Deben ser inmutables y resolubles en tiempo de compilación.

static readonly campos pueden y generalmente tienen tipos de referencia, que (que no sean cadenas) solo se pueden crear en tiempo de ejecución. Estos pueden (pero no deberían) ser tipos mutables; lo único que no puede cambiar es la referencia en sí misma.

Si necesita mantener un conjunto "constante" de instancias que sean tipos de referencia, generalmente lo hace con un conjunto de campos public static readonly, como los miembros de System.Drawing.SystemColors.

Por último, pero no menos importante, la inicialización de un campo readonly puede diferirse hasta que la ejecución de un constructor, lo que significa que a pesar de que sólo se puede escrito a una vez, no siempre tiene que ser inicializado con el exactamente el mismo valor Las constantes verdaderas declaradas con const solo pueden tener un único valor (especificado en tiempo de compilación).

+1

También se puede cambiar un readonly estático en un constructor, por lo que diferentes constructores pueden proporcionar diferentes valores para el campo de solo lectura estático. –

+0

@Jeff: No soy Joel. :PAG – Aaronaught

2

(no de sólo lectura) estática se puede cambiar después de que haya sido declarada, mientras que una constante no puede. Además, una constante no puede establecerse usando una función, mientras que una variable estática puede ser configurada.

6

Como usted dice, tanto estáticos como const están unidos a una tipo en lugar de un ejemplo de un tipo. Sin embargo, aún puede cambiar elementos estáticos. No puedes cambiar los objetos const.

Tenga cuidado con esto, sin embargo. Si su elemento const es un tipo de referencia, la expresión asignada debe evaluarse en tiempo de compilación, y eso significa que el único valor posible que puede dar como referencia es null (con la notable y útil excepción de cadenas).

+0

Esto no suena bien. Static también es válido en un campo. Y el único tipo de referencia de referencia posible es una cadena. No puedes cambiar una cadena. –

+0

También vale la pena señalar que los dos únicos tipos de referencia que puede contener una const son string y null –

+0

También me sonaba mal, justo después de que lo escribí. Así que fui y revisé: usted puede tener una serie de tipos de referencia. Sabía que eso era posible. Pero a excepción de las cadenas cuando lo haga, debe ser nulo. Actualizando mi respuesta para reflejar eso. –

11

Una diferencia sutil pero crucial es que consts se evalúan en tiempo de compilación, mientras que statics se evalúan en tiempo de ejecución. Esto tiene un impacto importante en el control de versiones. Por ejemplo, supongamos que escribe:

public const int MaxValue = 100; 

Compila y envía su conjunto (Ensamblaje A). Luego, alguien más escribe un ensamblaje (Ensamblaje B) que hace referencia a MaxValue. En este caso, el valor 100 se compila en su conjunto y en el suyo.

Si hubiera escrito esto:

public static readonly int MaxValue = 100; 

entonces la referencia en su montaje quedaría sólo eso, una referencia. Cuando alguien ejecutó el ensamblaje B, se cargará el valor 100 desde su ensamblaje, ensamblaje A.

Esto puede, por ejemplo, afectar escenarios de aplicación de parches simples.Si emite un Ensamblaje A actualizado donde MaxValues ​​se declara como 200 y el usuario copia esa versión sobre la versión anterior (pero no recompila el Ensamble B), entonces en el primer escenario el Ensamble B continuará operando como si MaxValues ​​fuera 100, porque ese es el valor const que se compiló en el Ensamble B. En el segundo escenario, el Ensamblado B recogerá el nuevo valor porque carga la variable no const static en tiempo de ejecución.

0

Una constante es una variable que no se puede cambiar de valor.

Una estática es una variable que no se puede usar fuera del alcance de su declaración. Es decir, si se trata de una variable global, solo se puede usar en el archivo que la declara. Si es una variable dentro de una función, entonces puede usarse solo dentro de esa función.

Cuestiones relacionadas