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 maxDictionary2
lleno 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
- Para asegurarse de que no obtiene un diccionario a medias cuando encuentra una excepción.
- 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.