1. Vermeiden Sie bedeutungslose Variableninitialisierungsaktionen
Die CLR stellt sicher, dass alle Objekte initialisiert werden, bevor auf sie zugegriffen wird, indem sie den zugewiesenen Speicher auf Null setzt. Daher besteht keine Notwendigkeit, Variablen auf 0, false oder null neu zu initialisieren.
//Im Allgemeinen sind es 10 oder weniger Elemente
private HashTable _items = null;
private NameValueCollection = _queryString = null;
private Zeichenfolge _siteUrl = null;
privater Uri _currentUri;
string RolesCacheKey = null;
string AuthenticationType = "forms";
bool _isUrlRewrite = false;
string _rawUrl = null;
HttpContext _httpContext = null
DateTime requestStarTime = DateTime.Now;
Es ist zu beachten, dass die lokalen Variablen in der Methode nicht vom Heap, sondern vom Stapel zugewiesen werden, sodass C# sie nicht löscht. Wenn eine nicht zugewiesene lokale Variable verwendet wird, wird während der Kompilierung ein Alarm ausgelöst. Weisen Sie den Mitgliedsvariablen aller Klassen nicht nur aus diesem Grund Werte zu. Die Mechanismen der beiden sind völlig unterschiedlich!
2. ValueType und ReferenceType
(1). Werttypparameter als Referenz übergeben.
Werttypen werden vom Aufrufstapel und Referenztypen vom verwalteten Heap zugewiesen. Wenn ein Werttyp als Methodenparameter verwendet wird, wird standardmäßig das Kopieren von Parameterwerten durchgeführt, was den Effizienzvorteil der Werttypzuweisung zunichte macht. Als grundlegende Technik kann die Übergabe von Werttypparametern als Referenz die Leistung verbessern.
private void UseDateByRef(ref DateTime dt){ }
public void foo()
{
DateTime now = DateTime.Now;
UseDateByRef(ref now);
}
(2), Stellen Sie die Equals-Methode für ValueType bereit
Die von .net standardmäßig implementierte ValueType.Equals-Methode verwendet die Reflexionstechnologie und verwendet die Reflexion, um die Werte aller Mitgliedsvariablen zum Vergleich zu erhalten. Wenn die Equals-Methode des von uns geschriebenen Wertobjekts verwendet werden soll (z. B. durch Platzieren des Wertobjekts in einer HashTable), sollte die Equals-Methode überladen werden.
öffentliche Struktur Rechteck
{
öffentliche doppelte Länge;
öffentliche Doppelbreite;
public override bool Equals (Objekt ob)
{
if (ob ist Rechteck)
return Equels ((Rectangle)ob))
anders
return false ;
}
privater Bool ist gleich (Rechteck, Rechteck)
{
return this .Length == rect.Length && this .Breadth == rect.Breach;
}
}
(3) Vermeiden Sie das Einpacken und Auspacken
C# kann durch Boxing und Unboxing automatisch zwischen Werttypen und Referenztypen konvertieren. Beim Boxen müssen Objekte vom Heap zugewiesen und Werte kopiert werden, was mit gewissen Leistungseinbußen verbunden ist. Wenn dieser Prozess in einer Schleife abläuft oder häufig als zugrunde liegende Methode aufgerufen wird, sollten Sie sich vor dem kumulativen Effekt in Acht nehmen.
Eine häufige Situation tritt bei der Arbeit mit Sammlungstypen auf. Zum Beispiel:
ArrayList al = new ArrayList();
for ( int i = 0 ; i < 1000 ; i ++ )
{
al.Add(i); // Implizit geboxt, da Add() ein Objekt akzeptiert
}
int f = ( int )al[ 0 ]; // Das Element ist entpackt
Die Lösung für dieses Problem besteht darin, den von .net2.0 unterstützten generischen Sammlungstyp zu verwenden.