2009-04-20 8 views
0

Si j'écris:Question sur C# optimiseur

SomeType simpleName = classWithLongName.otherLongName; 

Et puis utilisez "simpleName" au lieu de "classWithLongName.otherLongName", cela changera le programme de quelque façon que (pour la performance de l'instance sage)?

Que fait le compilateur avec cela? Est-ce qu'il copient + collez "classWithLongName.otherLongName", partout où j'utilise "simpleName".

Répondre

1

Cela dépend de ce que "otherLongName" est en train de faire. Si c'est une propriété, alors la différence est entre exécuter la propriété plusieurs fois ou seulement l'exécuter une fois. Cela peut ou non changer le comportement du programme de manière significative, en fonction de ce qu'il fait.

-1

Vous pouvez toujours en faire une fonction.

SomeType simpleName() { return classWithLongName.otherLongName; } 
+0

Ceci a un impact plus important. – Jules

0

Le compilateur est seulement autorisé à mettre en cache la valeur et le réutiliser lui-même lorsque vous tapez toujours « classWithLongName.otherLongName » si elle sait que la valeur ne changera pas au cours. Cependant, c'est rarement le cas. Par conséquent, si "classWithLongName.otherLongName" effectue un calcul, vous obtiendrez généralement de meilleures performances en le mettant en cache manuellement dans une variable locale comme vous l'avez suggéré. Toutefois, gardez à l'esprit que vous travaillez avec une valeur mise en cache et que les modifications de la valeur ou de la propriété d'origine ne seront pas répercutées sur votre valeur mise en cache. La longueur du nom n'est cependant que des métadonnées et n'a aucune influence sur les performances d'exécution, puisque le nom est déjà résolu en un handle interne lors de la compilation.

2

Non, le compilateur C# ne se traduit pas un appel à « simpleName » d'être la même chose que copier-coller « classWithLongName.otherLongName ». La différence peut être profonde ou simplement sémantique, mais ce que vous faites est d'attribuer la valeur de classWithLongName.otherLongName à simpleName. Que le type soit un type de valeur ou un type de référence déterminera exactement ce qui se passe et ce qui se passera si vous manipulez cette valeur, mais vous ne créez pas de pointeur de fonction ou de délégué pour ce faire.

Si cela aura un effet sur la performance n'est pas quelque chose qui peut être répondu ici, sauf pour dire que cela n'aura pas un effet négatif. Nous ne pouvons pas dire si cela aura un effet positif, car cela dépend de ce qui se passe réellement lorsque vous appelez classWithLongName.otherLongName. Si c'est une opération coûteuse, alors cela pourrait le rendre plus rapide, mais l'inconvénient serait que toute différence de valeur lors des appels suivants à classWithLongName.otherLongName ne serait pas reflétée si vous mettez en cache sa valeur dans simpleName.

0

Est-ce une question sur les instances ou les classes?

Par exemple

namespace MyCompany.MyApp.LongNamespaceName 
{ 
    public class MyClassWithALongName { 

     public SomeType AnInstanceProperty {get;set;} 

     public static SomeType AStaticProperty {get { ... }} 
    } 
} 

maintenant:

//this gets the static property 
SomeType simpleName = MyClassWithALongName.AStaticProperty; 

Autre possibilité:

MyClassWithALongName anInstanceWithALongName = new MyClassWithALongName(); 

//this gets the instance property 
SomeType simpleName = anInstanceWithALongName.AnInstanceProperty; 

Ceux-ci se comportent de différentes manières.

Il y a un autre cas ici cependant, vous pouvez créer un alias pour le nom réel de la classe:

using simpleName = MyCompany.MyApp.LongNamespaceName.MyClassWithALongName; 

... 
simpleName anInstance = new simpleName(); 
0
  • Si classWithLongName.otherLongName est une propriété, que les changements à simpleName ne changera pas classWithLongName. otherLongName.

  • Si classWithLongName.otherLongName est un membre de données publiques (un champ) d'un type de valeur, alors les modifications de simpleName ne changeront PAS classWithLongName.otherLongName.

  • Si classWithLongName.otherLongName est un membre de données public (un champ) d'un type de référence, alors les modifications de simpleName vont changer classWithLongName.otherLongName.

0

En supposant que votre type est un objet (référence) puis tapez simpleName va finir par contenir une référence à l'objet retourné par classWithLongName.otherLongName. Si vous allez ensuite faire beaucoup d'appels aux propriétés sur cet objet, vous pouvez obtenir une amélioration des performances, surtout si otherLongName est une propriété par opposition à un champ.