if (myFoo == null) myFoo = new Foo();
3 Réponses :
Vous êtes correct en ce que la première ligne fera toujours une mission. Je ne m'inquiéterais pas à ce sauf si le code n'est exécuté très souvent. p>
Que devriez-vous arrêter le compilateur de l'optimiser?
@Timbo: Je ne suis pas trop compétent quelles optimisations le compilateur peut ou ne pas faire, mais je fais l'hypothèse que myfoo code> sera utilisé ailleurs dans le code et que cela empêcherait le compilateur de l'optimiser une façon. S'il n'est pas utilisé ailleurs, c'est une histoire différente.
Je ne pense pas que cela utilise une mauvaise utilisation de l'opérateur null-coalescent. Lors de la lecture du code, il est aussi court et concis que possible et l'intention du code est évidente. P>
Il est correct que l'utilisation de l'opérateur null-coalescente comme celui-ci, vous obtiendrez toujours une mission, mais je ne m'inquiéterais pas à ce sujet. (Et si cela vraiment em> s'avère être un problème de performance, vous savez déjà comment le réparer). P>
J'ai comparé la CIL du code généré (en veillant à faire une version de version - avec optimiser le code vérifié dans les propriétés du projet, ce qui correspond au commutateur Ainsi, la même chose, à l'exception d'un supplément de pile-de-pile et de pop. Si cela peut être apporté pour faire une différence de performance mesurable, je vais acheter un chapeau spécifiquement dans le but de le manger; Par conséquent, allez avec celui que vous ressentez une meilleure lisibilité. p> (éditer) Oh, et la gigue peut être assez intelligente pour se débarrasser de cette différence! p> p> / optimiser> bascule sur csc.exe code>). C'est ce que j'ai obtenu (en utilisant vs 2008 - Notez que foo.maybefoo () code> est une méthode qui renvoie parfois null code>, parfois un foo code>) getfoowithif code>: p> getfooowithcoalescingoperator code>: p>
Est-ce avec csc.exe / optimiser + code>?
Je ne sais pas à quel point foo est vraiment. Est-ce que la taille affecte l'heure d'exécuter DUP & POP?
@ Gary dans le code ici, il s'agissait d'une classe code> code> et des références d'objet sont toutes de même taille. Avec un struct code>, vous obtiendriez un code différent, je suis sûr. Mais nous sommes conseillés de garder struct code> s à un maximum de 16 octets, donc pas trop pire.
Vous faites un argument convaincant pour le
?? = code> opérateur :)@PavelMinaev Dans ce cas, est-ce non identique au
|| = code>? Il faudrait remplacer un appelsi (! Isset (myfoo)) myfoo = nouveau foo (); code> pour garantir son propre opérateurCe n'est pas identique, car
|| code> nécessite une valeur booléenne.(Êtes-vous confondre cela avec PHP, par hasard? Notez que la question est étiquetée C #.)