2009-08-17 13 views
11

En este fragmento:C#: ¿Es segura esta asignación de campo?

class ClassWithConstants 
{ 
    private const string ConstantA = "Something"; 
    private const string ConstantB = ConstantA + "Else"; 

    ... 

} 

¿Existe un riesgo de acabar con ConstantB == "Else"? ¿O las asignaciones ocurren linealmente?

+0

@Svish, véase el comentario de Jon Skeet en su respuesta –

+0

@ Nathan, gracias, no se habían dado cuenta de esto: p – Svish

Respuesta

37

Usted siempre obtendrá "somethingelse". Esto es porque ConstantB depende de ConstantA.

Incluso puede cambiar de línea y obtendrá el mismo resultado. El compilador sabe que ConstantB depende de ConstantA y lo manejará en consecuencia, incluso si lo escribe en clases parciales.

Para estar completamente seguro, puede ejecutar VS Command Prompt y llamar a ILDASM. Ahí puede ver el código compilado real.

Además, si se intenta hacer lo siguiente obtendrá un error de compilación:

private const string ConstantB = ConstantA + "Else"; 
private const string ConstantA = "Something" + ConstantB; 

error: La evaluación del valor constante para 'ConsoleApplication2.Program.ConstantB' implica una definición circular Este tipo de prueba demuestra que el compilador conoce sus dependencias.


Agregado: Spec referencia señalado por Jon Skeet:

This is explicitly mentioned in section 10.4 of the C# 3 spec: Constants are permitted to depend on other constants within the same program as long as the dependencies are not of a circular nature. The compiler automatically arranges to evaluate the constant declarations in the appropriate order.


+2

Sí, se tienes razon - doh! :) Tratando de encontrar el bit en la especificación que garantiza esto ... –

+0

Encontrado ahora - sección 10.4. –

+3

Edité mi respuesta para que al menos no engañara a las personas, pero lo eliminaré si puedo. –

3

esta concatenación de cadenas ocurre en tiempo de compilación porque solo hay literales de cadenas (búsqueda de plegado constante en la literatura de construcción de compiladores).

No te preocupes.

2

Siempre debe evaluar a "somethingelse"

Cuestiones relacionadas