Pregunta

Tengo una aplicación de procesamiento de datos pseudo-en tiempo real en la que me gustaría usar LazyInit < double > , así que no hago cálculos que no necesito, pero LazyInit < T > restringe T a las clases. Puedo solucionarlo, pero obviamente preferiría no hacerlo.

¿Alguien sabe por qué es esto?

¿Fue útil?

Solución

La razón por la cual es una opción de API subyacente en LazyInit. Utiliza Interlocked.CompareExchange para hacer un conjunto de valores seguros para subprocesos. CompareExchange, mientras que genérico está restringido a usar solo tipos de clase. Por lo tanto, el valor T de LazyInit también debe ser una clase.

Puede ver la implementación aquí: LazyInit

Otros consejos

Nuestros bits actuales (vista previa) solo proporcionan un tipo LazyInit, y como observó (y JaredPar diagnosticó correctamente) restringimos T a los tipos de referencia para que podamos: (i) hacer que LazyInit sea una estructura, y (ii) proporcionar comportamiento predeterminado a través de CMPXCHG (es decir, podemos verificar si 'nulo' significa la ausencia de un valor). Podríamos haber hecho T sin restricciones, pero decidimos optimizar para el caso común; de lo contrario, habría significado unos pocos bytes adicionales; Lo creas o no, esto podría haber hecho que el tipo sea prohibitivamente costoso para algunas personas.

Recientemente hemos cambiado ligeramente de rumbo. Actualmente planeamos ofrecer un tipo LazyInit donde T no esté restringido además a un tipo LazyInitField donde T esté restringido a tipos de referencia. El primero es lo que usará la mayoría de las personas, pero el segundo puede usarse para aquellos que son conscientes del rendimiento y pueden vivir con la restricción de T.

Espero que esto aclare las cosas. Saludos,

--- joe duffy, líder de desarrollo de pfx

Creo que es porque los tipos de valor se inicializan automáticamente y LazyInit determina si algo necesita inicializarse en función de si es nulo o no. Puede evitarlo utilizando tipos anulables.

LazyInit<double?>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top