Gibt es beim Erstellen einer Klasse mit internen privaten Methoden, normalerweise um die Codeduplizierung zu reduzieren, für die keine Instanzfelder verwendet werden müssen, Leistungs- oder Speichervorteile, wenn die Methode als statisch deklariert wird?
Beispiel:
foreach (XmlElement element in xmlDoc.DocumentElement.SelectNodes("sample"))
{
string first = GetInnerXml(element, ".//first");
string second = GetInnerXml(element, ".//second");
string third = GetInnerXml(element, ".//third");
}
...
private static string GetInnerXml(XmlElement element, string nodeName)
{
return GetInnerXml(element, nodeName, null);
}
private static string GetInnerXml(XmlElement element, string nodeName, string defaultValue)
{
XmlNode node = element.SelectSingleNode(nodeName);
return node == null ? defaultValue : node.InnerXml;
}
Gibt es einen Vorteil, wenn die GetInnerXml () -Methoden als statisch deklariert werden? Bitte keine Meinungsantworten, ich habe eine Meinung.
c#
performance
NerdFury
quelle
quelle
Antworten:
Auf der FxCop-Regelseite dazu:
quelle
Wenn ich eine Klasse schreibe, fallen die meisten Methoden in zwei Kategorien:
Statische Methoden sind nützlich, da Sie nur anhand der Signatur erkennen, dass der Aufruf den Status der aktuellen Instanz nicht verwendet oder ändert.
Nehmen Sie dieses Beispiel:
Wenn eine Instanz des Bibliothekszustands jemals durcheinander gerät und ich versuche herauszufinden, warum, kann ich findBook als Schuldigen nur anhand seiner Unterschrift ausschließen.
Ich versuche so viel wie möglich mit der Signatur einer Methode oder Funktion zu kommunizieren, und dies ist eine hervorragende Möglichkeit, dies zu tun.
quelle
Library
ein InstanzfeldList<Book> _books
zum Speichern seiner Bücher hat (nicht wie SieLibrary
wahrscheinlich eine Klasse entwerfen würden, sondern w / e), und es übergibt diese Liste anfindBook
und diese statische Methode ruftbooks.Clear()
oderbooks.Reverse()
so weiter auf. Wenn Sie einer statischen Methode Zugriff auf einen Verweis auf einen veränderlichen Status gewähren, kann diese statische Methode Ihren Status sehr gut durcheinander bringen.Ein Aufruf einer statischen Methode generiert eine Aufrufanweisung in der Microsoft Intermediate Language (MSIL), während ein Aufruf einer Instanzmethode eine callvirt-Anweisung generiert, die auch nach Null-Objektreferenzen sucht. Meistens ist der Leistungsunterschied zwischen beiden jedoch nicht signifikant.
src: MSDN - http://msdn.microsoft.com/en-us/library/79b3xss3(v=vs.110).aspx
quelle
Ja, der Compiler muss den impliziten
this
Zeiger nicht anstatic
Methoden übergeben. Auch wenn Sie es in Ihrer Instanzmethode nicht verwenden, wird es dennoch übergeben.quelle
Es wird etwas schneller gehen, da dieser Parameter nicht übergeben wird (obwohl die Leistungskosten für den Aufruf der Methode wahrscheinlich erheblich höher sind als diese Einsparung).
Ich würde sagen, der beste Grund, den ich mir für private statische Methoden vorstellen kann, ist, dass Sie das Objekt nicht versehentlich ändern können (da es diesen Zeiger nicht gibt).
quelle
Dies zwingt Sie dazu, sich daran zu erinnern, auch alle von der Funktion verwendeten Elemente mit Klassenbereich als statisch zu deklarieren, wodurch der Speicher für die Erstellung dieser Elemente für jede Instanz gespart werden sollte.
quelle
Ich bevorzuge es sehr, dass alle privaten Methoden statisch sind, es sei denn, sie können es wirklich nicht. Ich würde Folgendes sehr bevorzugen:
über jede Methode, die auf das Instanzfeld zugreift. Warum ist das? Da dieser Berechnungsprozess komplexer wird und die Klasse 15 private Hilfsmethoden enthält, möchte ich sie WIRKLICH in eine neue Klasse ziehen können, die eine Teilmenge der Schritte auf semantisch sinnvolle Weise kapselt.
Wenn
MyClass
mehr Abhängigkeiten auftreten, weil wir protokollieren müssen und auch einen Webdienst benachrichtigen müssen (bitte entschuldigen Sie die Klischeebeispiele), ist es wirklich hilfreich, leicht zu erkennen, welche Methoden welche Abhängigkeiten haben.Mit Tools wie R # können Sie eine Klasse mit wenigen Tastenanschlägen aus einer Reihe privater statischer Methoden extrahieren. Versuchen Sie es, wenn alle privaten Hilfsmethoden eng mit dem Instanzfeld verbunden sind und Sie feststellen, dass dies zu Kopfschmerzen führen kann.
quelle
Wie bereits erwähnt, bieten statische Methoden viele Vorteile. Jedoch; Denken Sie daran, dass sie für die gesamte Lebensdauer der Anwendung auf dem Haufen leben werden. Ich habe vor kurzem einen Tag damit verbracht, einen Speicherverlust in einem Windows-Dienst aufzuspüren. Der Fehler wurde durch private statische Methoden in einer Klasse verursacht, die IDisposable implementiert hat und konsistent von einer using-Anweisung aufgerufen wurde. Jedes Mal, wenn diese Klasse erstellt wurde, wurde Speicher auf dem Heap für die statischen Methoden innerhalb der Klasse reserviert. Leider wurde der Speicher für die statischen Methoden nicht freigegeben, als die Klasse entsorgt wurde. Dies führte dazu, dass der Speicherbedarf dieses Dienstes innerhalb weniger Tage den verfügbaren Speicher des Servers mit vorhersehbaren Ergebnissen verbrauchte.
quelle