7
votes

Comment fonctionne la méthode de travail pour les propriétés automatiques en C #?

Je lis, je lis efficace C # (deuxième édition) et il parle de méthode d'allusion em>.

Je comprends le principe, mais je ne comprends pas Voyez comment cela fonctionnerait basé sur les 2 exemples du livre. Le livre dit: P>

Moyens d'inlinage pour substituer le corps d'une fonction pour l'appel de la fonction. P> blockQuote>

assez juste, donc si j'ai une méthode, et son appel: p> xxx pré>

Le compilateur JIT pourrait (sera-t-il?) en ligne pour: P>

string val = "Default Name";
if(Obj != null)
    val = Obj.Name;


3 commentaires

La question est actuellement très large, répondant aux éléments suivants contribuerait: quel est le livre indiquant que l'inclusion résultante sera-t-elle? Pourquoi pensez-vous que cela ne fonctionnera pas?


par compilateur, vous voulez dire Jiter Compiler?


@ARLANDESS, @LUKAS - Le livre mentionne ces deux exemples et n'indique pas plus avant comment il sera inliné, d'où ma question. Oui, je veux dire le compilateur JIT. J'ai mis à jour ma question pour faire clairement ces points, merci.


3 Réponses :


4
votes

hypothétiquement strong> parler, l'afflication ici déballerait le corps de get_name () code> généré automatiquement par le compilateur, qui renvoie simplement un champ de support privé. Cela pourrait ressembler à ceci:

string val = Obj.k__BackingField;


2 commentaires

En effet. Bien entendu, le compilateur C # ne fait aucune inlinge, qui est à la place différée au JIT. Au niveau JIT, il n'y a plus une différence entre les appels de méthode et les accès à la propriété - les deux peuvent être inlinés de la même manière.


@Hans je ne sais pas si cela ferait cela dans ce cas, donc c'est hypothétique pour moi.



2
votes

Inlinaison prend des endroits après les contrôles d'accessibilité , il peut donc optimiser le code de manière à ce que vous ne puissiez pas avec une substitution simple source.


0 commentaires

6
votes

Les propriétés automatiques sont le sucre syntaxique pour les propriétés sauvegères de champ.

Les propriétés sont du sucre syntaxique pour le régleur et / ou les méthodes getter. P>

Par conséquent, le code que vous donnez est plus ou moins équivalent à: p> xxx pré>

alors string val = obj.name code> devient équivalent à string val = obj.get_name () code> qui peut être inlincé à string val = obj._name code>. p>

de même que le code p> xxx pré>

est équivalent à: p>

string val = "Default Name";
if(Obj != null)
  val = Obj._name;


0 commentaires