7 Stimmen

Statische Klassen in C#

Bei der Beantwortung dieser Frage (https://stackoverflow.com/questions/352317/c-coding-question#352327) kam mir folgende Frage in den Sinn...

Besteht die Gefahr, dass eine statische Klasse als äquivalent zur Instanziierung einer nichtstatischen Klasse betrachtet wird, die das Singleton-Muster implementiert?

10voto

Kris Punkte 38235

Das einzige, was mir sofort ersichtlich erscheint, ist, dass eine statische Klasse im Grunde nur eine Sammlung von abgegrenzten Funktionen ist (hier explizit "Methoden" vermeidend) und ein Singleton immer noch etwas ist, das du instanziieren kannst, auch wenn du nur 1 haben kannst. 1 > 0.

Du kannst ein Singleton als Argument an etwas übergeben, das ein Objekt einer bestimmten Schnittstelle erwartet, eine statische Klasse kannst du nirgendwo übergeben (außer durch einige Reflection-Tricks).

4voto

Marc Gravell Punkte 970173

Auf viele Arten sind eine statische Klasse und ein Singleton ähnlich. Ein großer Unterschied besteht darin, dass ein Singleton einige Schnittstellen implementieren könnte, was bei einer statischen Klasse nicht möglich ist. Zum Beispiel bieten Comparer.Default / EqualityComparer.Default (über die Schnittstelle) die Möglichkeit, das Element beim Sortieren / Verwenden eines Dictionarys zu verwenden.

Es ist auch möglich (wenn auch knifflig), ein Singleton mit den Standard-Serialisierungsframeworks zu verwenden. Bei einer statischen Klasse müssten Sie jede Zuständigkeit manuell verwalten.

2voto

Joe Punkte 117971

Es ist nicht genau äquivalent. Zum Beispiel können Sie eine Referenz auf eine Singleton-Instanz als Argument übergeben, was Sie mit einer statischen Klasse nicht tun können, da es keine Instanz gibt.

Was meinen Sie mit "Gefahr"?

1voto

krosenvold Punkte 73093

Wie Robert Gould betonte, verlieren Sie die Kontrolle über die Konstruktion. Sie werden auch Konstruktionsprobleme haben, die viel obskurer sind. Statische Klassen landen schnell mit statischen Initialisierungsblöcken. Diese Blöcke werden aufgerufen, sobald jemand Ihren Typ referenziert, und diese Reihenfolge ist möglicherweise nicht so gut definiert, wie Sie denken. Daher kann die Reihenfolge dieser statischen Initialisierer ohne Ihr Zutun geändert werden und zu seltsamen Fehlern führen.

1voto

Martin Brown Punkte 23597

Die Hauptgefahr, die ich bei statischen Klassen sehe, ist, dass sie beim Schreiben von Unit-Tests viel schwieriger zu mocken sind. Mit einem Singleton können Sie es so erstellen, dass Sie eine andere Klasse anstelle davon einfügen können, die testspezifische Funktionalität bietet. Bei einer statischen Klasse ist das nicht so einfach.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X