Saltar al contenido

¿Cómo funciona la inicialización del diccionario en C#?

Por fin después de tanto luchar ya encontramos el resultado de este inconveniente que muchos de nuestros lectores de este sitio web presentan. Si deseas aportar alguna información no dejes de aportar tu información.

Solución:

Sí, el compilador usa un constructor sin parámetros predeterminado y luego agrega todos los valores especificados en el inicializador de la colección a través del método Dictionary.Add. Como señaló Jon, su código se compila en

Dictionary maxDictionary2;
Dictionary maxDictionary;

maxDictionary2 = new Dictionary();
maxDictionary2.Add(10, 40000.0);
maxDictionary = maxDictionary2;

LI generada:

.maxstack 3
.locals init (
     [0] class [mscorlib]Dictionary`2 maxDictionary,
     [1] class [mscorlib]Dictionary`2 maxDictionary2)
L_0000: nop 
L_0001: newobj instance void [mscorlib]Dictionary`2::.ctor()
L_0006: stloc.1 
L_0007: ldloc.1 
L_0008: ldc.i4.s 10
L_000a: ldc.r8 40000
L_0013: callvirt instance void [mscorlib]Dictionary`2::Add(!0, !1)
L_0018: nop 
L_0019: ldloc.1 
L_001a: stloc.0 

Es decir, diccionario creado asignado a variable temporal maxDictionary2lleno de valores, y solo entonces la referencia al diccionario creado y lleno se copia en maxDictionary variable.

Tenga en cuenta que puede especificar cualquier otro constructor, si no desea utilizar uno sin parámetros. Por ejemplo, puede usar uno que establezca la capacidad inicial:

var maxDictionary = new Dictionary(10)   10, 40000  ;

var maxDictionary = new Dictionary   10, 40000  ;

Aquí está el IL generado del programa

IL_0001:  newobj      System.Collections.Generic.Dictionary..ctor
IL_0006:  stloc.1     // <>g__initLocal0
IL_0007:  ldloc.1     // <>g__initLocal0
IL_0008:  ldc.i4.s    0A 
IL_000A:  ldc.r8      00 00 00 00 00 88 E3 40 
IL_0013:  callvirt    System.Collections.Generic.Dictionary.Add
IL_0018:  nop         
IL_0019:  ldloc.1     // <>g__initLocal0
IL_001A:  stloc.0     // maxDictionary

Claramente usa un constructor sin parámetros y llamadas Add método. La etiqueta “IL_0013” muestra la llamada a Add método

El código c# equivalente sería

Dictionary maxDictionary;
Dictionary temp = new Dictionary();
temp.Add(10, 40000.0);
maxDictionary = temp;

Vale la pena señalar que el compilador usa temp variable, puedo ver dos razones para eso

  1. Para asegurarse de que no obtiene un diccionario a medias cuando encuentra una excepción.
  2. No espera que el compilador lea el campo simplemente creando una nueva instancia y asignando. ¿no es así?

Reseñas y puntuaciones de la guía

Acuérdate de que tienes la capacidad de añadir una evaluación certera si diste con la solución.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *