2009-04-20 7 views
0

Wenn ich schreiben:Frage zu C# Optimierer

SomeType simpleName = classWithLongName.otherLongName; 

Und dann verwenden „simpleName“ anstelle von „classWithLongName.otherLongName“, wird dies das Programm in irgendeiner Weise ändern (für weise Instanz Leistung)?

Was macht der Compiler damit? Kopiert + fügt "classWithLongName.otherLongName" ein, überall wo ich "simpleName" verwende.

Antwort

1

Es hängt davon ab, was "otherLongName" tatsächlich macht. Wenn es sich um eine Eigenschaft handelt, liegt der Unterschied darin, die Eigenschaft mehrmals auszuführen oder nur einmal auszuführen. Das kann oder kann nicht das Verhalten des Programms in signifikanter Weise ändern, je nachdem, was es tut.

-1

Sie können immer eine Funktion machen.

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

Dies hat eine größere Auswirkung. – Jules

0

Der Compiler wird nur den Wert zwischenzuspeichern erlaubt und es sich wieder verwenden, wenn Sie immer „classWithLongName.otherLongName“ eingeben, wenn es im Verlauf nicht ändern wird der Wert weiß, dass. Dies ist jedoch selten der Fall.

Wenn daher "classWithLongName.otherLongName" eine Berechnung ausführt, erzielen Sie normalerweise eine bessere Leistung, indem Sie es wie von Ihnen vorgeschlagen in einer lokalen Variablen zwischenspeichern. Beachten Sie jedoch, dass Sie mit einem zwischengespeicherten Wert arbeiten und dass Änderungen des ursprünglichen Werts oder der ursprünglichen Eigenschaft nicht in Ihrem zwischengespeicherten Wert berücksichtigt werden.

Die Länge des Namens ist jedoch nur Metadaten und hat keinen Einfluss auf die Laufzeitleistung, da der Name beim Kompilieren bereits in ein internes Handle aufgelöst wurde.

2

Nein, der C# -Compiler übersetzt einen Aufruf von "simpleName" nicht so, als ob er "classWithLongName.otherLongName" kopieren und einfügen würde. Der Unterschied könnte tiefgründig oder einfach semantisch sein, aber was Sie tun, ist die Zuweisung des Werts von classWithLongName.otherLongName zu simpleName. Ob der Typ ein Werttyp oder ein Referenztyp ist, bestimmt genau, was passiert und was passiert, wenn Sie diesen Wert ändern, aber Sie erstellen dabei keinen Funktionszeiger oder Delegaten.

Ob dies Auswirkungen auf die Leistung hat, kann hier nicht beantwortet werden, außer zu sagen, dass es keinen NEGATIVEN Effekt hat. Wir können nicht sagen, ob es einen positiven Effekt haben wird, da das davon abhängen würde, was tatsächlich passiert, wenn Sie classWithLongName.otherLongName anrufen. Wenn das ein teurer Vorgang ist, könnte dies die Geschwindigkeit erhöhen, aber der Nachteil wäre, dass Wertunterschiede bei nachfolgenden Aufrufen an classWithLongName.otherLongName nicht reflektiert würden, wenn Sie den Wert in simpleName zwischenspeichern.

0

Ist dies eine Frage über Instanzen oder Klassen?

Zum Beispiel

namespace MyCompany.MyApp.LongNamespaceName 
{ 
    public class MyClassWithALongName { 

     public SomeType AnInstanceProperty {get;set;} 

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

Jetzt:

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

Alternativ:

MyClassWithALongName anInstanceWithALongName = new MyClassWithALongName(); 

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

Diese werden auf unterschiedliche Weise verhalten.

Es gibt einen weiteren Fall hier aber können Sie einen Alias ​​für den tatsächlichen Namen der Klasse erstellen:

using simpleName = MyCompany.MyApp.LongNamespaceName.MyClassWithALongName; 

... 
simpleName anInstance = new simpleName(); 
0
  • Wenn classWithLongName.otherLongName eine Eigenschaft ist, als Änderungen simpleName NICHT classWithLongName ändern. andererLangname.

  • Wenn classWithLongName.otherLongName ein öffentliches Datenelement (ein Feld) eines Werttyps ist, werden Änderungen an simpleName klasseWithLongName.otherLongName NICHT ändern.

  • Wenn classWithLongName.otherLongName ein öffentliches Datenelement (ein Feld) eines Verweistyps ist, werden Änderungen an simpleName die Klasse witLongName.otherLongName ändern.

0

Ihre Art Angenommen ist ein Objekt (Referenz) gibt dann simpleName wird eine Referenz auf das Objekt am Ende enthält, durch classWithLongName.otherLongName zurück. Wenn Sie dann viele Aufrufe von Eigenschaften für dieses Objekt ausführen, erhalten Sie möglicherweise eine Leistungsverbesserung, besonders wenn otherLongName eine Eigenschaft im Gegensatz zu einem Feld ist.