2010-01-07 17 views
29

me gusta la sintaxis de C# 3 de inicialización y uso mucho, pero hoy mientras se mira en el reflector, la siguiente ocurrió:inicializador sintaxis

var binding = new WSHttpBinding 
{ 
    ReaderQuotas = { MaxArrayLength = 100000 }, 
    MaxReceivedMessageSize = 10485760 
}; 

Al principio pensé que era un error, pero se compila ! Supongo que todavía estoy aprendiendo cosas nuevas todo el tiempo. :)

Por lo que puedo decir, establece la propiedad MaxArrayLength de la ReaderQuotas propiedad de la WSHttpBinding.

¿Esta sintaxis crea un nuevo objeto ReaderQuotas y luego establece la propiedad, o supone que la propiedad se va a inicializar? ¿Es esta la manera general que se usaría para inicializar las propiedades 'hijo'?

hago encontrar la sintaxis un poco confuso ...

+0

Puede que esté interesado en [esta publicación] (http: //www.codeducky.org/even-concise-c-object-initializers /), que analiza la semántica y los casos de uso para este tipo de inicializador – ChaseMedallion

Respuesta

22

No, que no crea nuevos objetos a menos que utilice = new SomeType {...}:

var binding = new WSHttpBinding 
{ 
    ReaderQuotas = new XmlDictionaryReaderQuotas { MaxArrayLength = 100000 }, 
    MaxReceivedMessageSize = 10485760 
}; 

Su ejemplo muestra la sintaxis de inicialización para establecer las propiedades de sub-objetos existentes. También hay una sintaxis similar para llamar a los métodos de "Agregar" en las colecciones.

su código es ampliamente comparables a:

var binding = new WSHttpBinding(); 
binding.ReaderQuotas.MaxArrayLength = 100000; 
binding.MaxReceivedMessageSize = 10485760; 
+0

Parece idéntico a eso, ¿existe algo más que una simple diferencia sintáctica? Parece que (a menos que ReaderQuotas se inicialice en el contructor de WSHttpBinding) debería lanzar una excepción – James

+0

Gracias, me tomó por sorpresa :) Supongo que con 'Agregar' te refieres a un inicializador de colección? – leppie

+0

@james: esperaría una excepción en ese caso, pero no tener código fuente podría resultar confuso, si no sabes lo que se hace en el constructor. Algunas sobrecargas de constructor pueden o no inicializar esa propiedad, lo que generará aún más confusión. – leppie

14

Es un poco confuso, estoy de acuerdo.

Debe leer la sección 7.6.10.2 de la especificación; todo se explica allí. Por ejemplo:

A inicializador miembro que especifica una expresión después del signo igual se procesa de la misma manera como una asignación al campo o propiedad.

A inicializador miembro que especifica un inicializador objeto después de los iguales signo es un inicializador 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 del objeto anidado se tratan como asignaciones a los miembros del campo o propiedad. Los inicializadores de objetos anidados no pueden ser aplicados a las propiedades con un tipo de valor , ni a los campos de solo lectura con un tipo de valor .

Un inicializador miembro que especifica un inicializador recogida después del signo igual es una inicialización de una colección incrustada. En lugar de asignando una nueva colección al campo o propiedad , los elementos dados en el inicializador se agregan a la colección a la que hace referencia el campo o la propiedad .

Cuestiones relacionadas