Question

J'ai une application de traitement de données pseudo-temps réel dans laquelle je voudrais utiliser LazyInit < double > afin de ne pas effectuer de calculs inutiles, mais LazyInit < T > limite T aux classes. Je peux y remédier, mais je préférerais évidemment ne pas le faire.

Quelqu'un sait-il pourquoi?

Était-ce utile?

La solution

La raison pour laquelle un choix d’API de sous-habillage dans LazyInit a été choisi Il utilise Interlocked.CompareExchange afin de créer un ensemble de valeurs thread-safe. CompareExchange alors que generic est contraint de n'utiliser que des types de classe. Par conséquent, la valeur T de LazyInit doit également être une classe.

Vous pouvez voir la mise en œuvre ici: LazyInit

Autres conseils

Nos bits actuels (aperçu) fournissent uniquement un type LazyInit et, comme vous l'avez observé (et JaredPar est correctement diagnostiqué), nous limitons T aux types référence afin que nous puissions: (i) transformer LazyInit en structure, et (ii) fournir des informations raisonnables. comportement par défaut via CMPXCHG (c.-à-d., nous pouvons vérifier que 'null' signifie l'absence de valeur). Nous aurions pu faire T illimité, mais avons décidé d'optimiser pour le cas courant - autrement, cela aurait signifié quelques octets supplémentaires; Croyez-le ou non, cela aurait rendu le type prohibitif pour certains.

Nous avons récemment changé légèrement de cap. Nous prévoyons actuellement de proposer un type LazyInit où T est illimité en plus à un type LazyInitField où T est limité aux types de référence. Le premier est ce que la plupart des gens vont utiliser, mais le dernier peut être utilisé pour ceux qui sont conscients de la performance et peuvent vivre avec la restriction sur T.

J'espère que cela clarifie les choses. Cordialement,

--- joe duffy, responsable du développement pfx

Je pense que c’est parce que les types de valeur sont automatiquement initialisés et que LazyInit détermine s’il faut ou non initialiser l’initialisation en fonction de la valeur NULL ou non. Vous pouvez le contourner en utilisant des types nullables.

LazyInit<double?>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top