c# - generate - Sintaxis inicializadora
params comments c# (2)
Me gusta la sintaxis del inicializador C # 3 y la uso mucho, pero hoy, mientras buscaba en Reflector, surgió lo siguiente:
var binding = new WSHttpBinding
{
ReaderQuotas = { MaxArrayLength = 100000 },
MaxReceivedMessageSize = 10485760
};
Al principio pensé que era un error, ¡pero compila! Supongo que todavía estoy aprendiendo cosas nuevas todo el tiempo. :)
Por lo que puedo decir, establece la propiedad MaxArrayLength
de la propiedad ReaderQuotas
de WSHttpBinding
.
¿Esta sintaxis crea un nuevo objeto ReaderQuotas
y luego establece la propiedad, o asume que la propiedad ya está inicializada? ¿Es esta la forma general que se usaría para inicializar propiedades ''secundarias''?
Encuentro la sintaxis un poco confusa ...
Es un poco confuso, estoy de acuerdo.
Debe leer la sección 7.6.10.2 de la especificación; todo está explicado allí. Por ejemplo:
Un inicializador de miembro que especifica una expresión después del signo igual se procesa de la misma manera que una asignación al campo o propiedad.
Un inicializador de miembro que especifica un inicializador de objeto después del signo igual es un inicializador de objeto anidado, es decir, una inicialización de un objeto incrustado. En lugar de asignar un nuevo valor al campo o propiedad, las asignaciones en el inicializador de objeto anidado se tratan como asignaciones a los miembros del campo o propiedad. Los inicializadores de objetos anidados no se pueden aplicar a propiedades con un tipo de valor, o a campos de solo lectura con un tipo de valor.
Un inicializador de miembro que especifica un inicializador de colección después del signo igual es una inicialización de una colección incrustada. En lugar de asignar una nueva colección al campo o propiedad, los elementos dados en el inicializador se agregan a la colección referenciada por el campo o propiedad.
No, eso no crea nuevos objetos a menos que use = new SomeType {...}
:
var binding = new WSHttpBinding
{
ReaderQuotas = new XmlDictionaryReaderQuotas { MaxArrayLength = 100000 },
MaxReceivedMessageSize = 10485760
};
Su ejemplo muestra la sintaxis del inicializador para configurar las propiedades de los subobjetos existentes . También hay una sintaxis similar para llamar a los métodos "Agregar" en las colecciones.
Su código es ampliamente comparable a:
var binding = new WSHttpBinding();
binding.ReaderQuotas.MaxArrayLength = 100000;
binding.MaxReceivedMessageSize = 10485760;