2010-02-15 18 views
30

No parece haber ninguna manera como los tipos anónimos derivan del objeto. Pero pensé en preguntar, ya que gran parte del tiempo utilizamos tipos anónimos en expresiones de consulta simples para extraer subconjuntos de datos que se utilizarán en esos tipos anónimos que creamos. Simplemente me parece que deberían ser estructuras (tipos de valores) para una mayor eficiencia de la memoria frente a los tipos de referencia.¿Hay alguna forma de crear estructuras anónimas en C#?

¿Pensamientos?

+0

Esta sería una alternativa ideal a las clases anónimas en situaciones donde los picos de GC son indeseables. –

Respuesta

28

No hay ninguna apoyado sintaxis de C# que producirá estructuras anónimas

+9

suspiro. Bummer Dood. {-o) – Boydski

+0

Este es el caso a partir de C# 7.0. Sentí que sería bueno indicar un número de versión en caso de que esta respuesta sea incorrecta con el lanzamiento de una nueva versión de sintaxis (por ejemplo, 7.2, 8.0). –

3

¿Ha perfilado su aplicación y los tipos anónimos encontrado para ser la parte más lenta de la misma? Si es así, le sugiero que cree manualmente las estructuras necesarias y vuelva a probar para ver si eso solucionó su problema. De lo contrario, pasaría más tiempo preocupándome por el problema del negocio y menos tiempo escribiendo (como lo permite la función).

+5

Lo sentimos, no fue sugerir que hubo ningún problema. De ningún modo. Siempre estoy buscando formas de aliviar la carga del GC como una cuestión de principios. Cada vez que puedo poner cosas en la pila, lo hago. Los tipos simples que están allí simplemente como transportes de datos simples serían mejor servidos para estar en la pila. – Boydski

+2

Si va a elegir una herramienta de su caja de herramientas, también puede elegir la mejor, siempre que la elección en sí misma no pierda tiempo. –

12

ACTUALIZACIÓN:. C# 7 tiene ahora tuplas de tipo valor, que se pueden utilizar en el mismo tipo de contextos que como referencia y los tipos anónimos se utilizan en


Parece que este comúnmente portátil idea de que los tipos de valores son "más eficientes" que los tipos de referencia. Esto es completamente mítico; son más eficientes para algunas operaciones y menos eficientes para otras.

Por ejemplo, los tipos de valores grandes son menos eficientes en comparación con los tipos de referencia si la unidad de trabajo que están preocupados es la obra "copiar el valor a una nueva ubicación". Un tipo de referencia copia una referencia de tamaño de puntero independientemente del tamaño de los datos referidos y, por lo tanto, copia en una única instrucción de máquina altamente optimizada. Un tipo de valor copia el tamaño de los datos cada vez, que puede ser bastante grande y tomar múltiples instrucciones.

En cualquier caso, los tipos anónimos son exclusivamente una característica de conveniencia. Si no le gustan sus características de rendimiento, no tiene que usarlas. Puedes definir tu propia estructura si prefieres.

+18

Lo siento Eric. La pregunta podría haber sido más elegante. Soy plenamente consciente de que esto gira en torno al contexto. Siempre se debe usar la sabiduría al elegir el valor frente a los tipos de referencia para una funcionalidad más compleja. Pero la mayoría de los ejemplos de tipos de anon que he visto crean y destruyen constantemente pequeñas instancias de objetos (entre 3 y 5 valores de miembros, más o menos); el objeto se usa como un mero transporte de datos simples en Gen 0 del montón. Obviamente es más costoso que hacerlo en la pila. Me gusta la conveniencia azucarada de los tipos anónimos. Pero aún sería genial poder elegir entre ref vs. valor. – Boydski

+0

Sí, es una función de conveniencia, una que es muy útil para iterar sobre un tipo de compuesto ad-hoc que agrega cierta información y no desea guardar en ningún otro lugar que no sea el contexto que se está ejecutando actualmente. –

-1

veces uso objetos anónimos:

var x = new 
{ 
    itm0 = new { key = "key0", val = 0}, 
    itm1 = new { key = "key1", val = 1}, 
}; 
+0

¿Su respuesta responde a la pregunta de OP? – nawfal

+2

Su respuesta es incorrecta o está respondiendo la pregunta incorrecta. OP preguntó si podíamos construir estructuras anónimas. Está construyendo una clase anónima con clases anónimas incrustadas. –

2

Para muchos casos de uso, los tipos anónimos y tuplas sería más eficiente si se implementa como estructuras de campo público que las clases inmutables; si un tipo o tupla anónimo particular sería más eficiente, ya que tal estructura o clase inmutable no es particularmente una función de su tamaño, sino más bien una función de cómo se usa. Si una cosa nunca va a ser en caja, el costo relativo de la utilización de una estructura frente a una clase dependerá del tamaño y de cuántas veces la cosa tendría que ser copiado (tenga en cuenta que las llamadas estructuras "inmutables" a menudo tienen que se copian muchas más veces que las estructuras de campo público). Si una cosa solamente se copia una o dos veces después de la construcción (común en muchos escenarios de uso), una estructura de campo público de prácticamente cualquier tamaño llevará a cabo mejor que pudo una clase inmutable. Por otro lado, si una cosa frecuencia conseguirá coaccionado a un tipo de referencia, una clase inmutable superará sustancialmente una estructura, no importa cuán pequeño.

El gasto de coaccionar a los tipos de estructura para hacer referencia a los tipos, y el hecho de que algunos casos de uso requerirían hacerlo con frecuencia, significa que incluso si los objetos más temporales estructuras serían más eficientes que los objetos de clases inmutables, utilizando estructuras por todo lo haría ser menos eficiente que usar objetos de clase inmutables para todo. Los casos de uso en los que las estructuras permitirían mejorar el rendimiento general en un 10% o más probablemente sean demasiado raras para justificar el costo de tener dos tipos diferentes de tuplas y dos tipos diferentes de tipos anónimos incorporados.El código que necesita las ventajas de rendimiento de las estructuras de campo abierto puede definir fácilmente los tipos de estructuras para sus propósitos exactos.

Cuestiones relacionadas