2009-03-28 23 views
7

En Java variables de instancia puede ser inicializado por un bloque de inicialización, como se muestra a continuación:C# equivalente de Java ejemplo inicializador

class Example { 
    private int varOne; 
    private int varTwo; 

    { 
     // Instance Initializer 
     varOne = 42; 
     varTwo = 256; 
    } 
} 

¿Hay una construcción equivalente en C#?

[Editar] Sé que esto puede estar en línea con la declaración de variable de instancia. Sin embargo, estoy buscando algo similar al constructor estático en C# pero por ejemplo variables.

+0

Punto de pedantería: los bloques de inicialización de instancia y la inicialización del campo de instancia son ejecutados por el constructor inmediatamente * después de * llamar a super. –

+0

@Tom - Tiene razón sobre el orden de llamada. El comentario del código fuente es eliminado. – maxyfc

+0

¿Por qué no simplemente hacer un método y llamarlo desde el constructor, si eso es lo que sucede detrás de la escena de todos modos? – toxvaerd

Respuesta

5

Realmente no hay equivalente en C#. C# tiene sólo 2 formas de inicializar instancia varibles

  1. En el constructor
  2. Por inicializar explícitamente la variable en su punto de declaración

No hay manera de hacer una inicialización después de crear el objeto, sino antes de que el constructor se ejecute.

7

Crear un constructor de instancias que cualquier otro constructor local se comunicará en la lista de inicialización:

private Example() 
{ 
    //initialize all fields here 
} 

public Example (/*list of parameters*/) : this() 
{ 
    //do specific work here 
} 

Si el constructor por defecto ya está requerido por la lógica de la aplicación, a continuación, susbstitute

private Example() 

con

private Example (object dummy) 

y, por supuesto, en consecuencia modificar la llamada de iniciación.

+0

lamentablemente eso no le permite tener bloques de inicializador de instancias múltiples ... pero para el caso común sería razonable. – TofuBeer

+0

Curious - ¿Qué es TofuBeer? y también, ¿por qué querrías bloques de inicializador de instancias múltiples? Para este último, parece que generaría confusión con los bloques dispersos por todo el código de clase, separados de los constructores y separados de las decls de miembros. – Cheeso

+0

un ejemplo de concrerte - hay un campo privado de solo lectura que necesito inicializar basado en algunos métodos de clase que no están disponibles en la inicialización estática. –

0

Si esto es lo que desea para el caso específico, entonces medida en que es posible es la siguiente:

class Example { 
    public int varOne; 
    public int varTwo; 

    public Example(){ 
     Console.WriteLine("varOne : " + varOne + ", varTwo : " + varTwo); 
    } 

    public void getValues() 
    { 
     Console.WriteLine("varOne : " + varOne + ", varTwo : " + varTwo); 
    } 
} 

static void Main(string[] args) 
    { 
     Example e = new Example{ varOne = 42, varTwo = 256}; 
     e.getValues(); 
    } 

Aquí, entonces no es una restricción que se requeriría variables de instancia a ser pública.