Frage

Die Probleme sind:

  • GUI-Bibliotheken wie als Standarddarstellung für Klassen verwenden ToString. Es muss sie lokalisiert werden.
  • ToString wird zur Protokollierung. Es sollte bezogenen Informationen Programmierung bieten, wird nicht unterstützt und beinhaltet interne Zustände wie Ersatzschlüssel und Enum-Werte.
  • ToString wird von vielen String-Operationen verwendet, die Objekte als Argumente, zum Beispiel String.Format, wenn zu Ströme zu schreiben. Je nach Kontext erwarten Sie etwas anderes.
  • ToString ist zu begrenzt, wenn es viele verschiedenen Darstellungen des gleichen Objekts, zum Beispiel. eine lange und eine kurze Form.

Aufgrund der unterschiedlichen Nutzungen, es gibt viele verschiedene Arten der Umsetzung. So sind sie zu unzuverlässig wirklich nützlich zu sein.

Wie soll ToString umgesetzt werden, nützlich zu sein? Wann sollte ToString verwendet werden, wann sollte es vermieden werden?


Die .NET Framework Dokumentation sagt:

  

Diese Methode gibt einen Menschen lesbaren   String, Kultur empfindlich ist.

Es gibt eine ähnliche Frage , aber nicht gleich.

War es hilfreich?

Lösung

Es scheint, dass Sie große Erwartungen aus einer winzigen kleinen Methode haben :) Soweit ich weiß, es ist keine gute Idee, eine allgemeine Methode in so viele unterschiedlichen Kontexten speziell zu verwenden, wenn das Verhalten von Klasse zu Klasse unterschiedlich sein kann.

Hier sind meine Vorschläge:

1.Do nicht zulassen, GUI-Bibliotheken verwenden ToString () Ihre objects.Instead verwenden sinnvolle Eigenschaften (fast alle Bedienungselemente angepasst werden können andere Eigenschaften als ToString zu zeigen) zum Beispiel Display verwenden. 2. Wenn einige Informationen über ein Objekt bekommen (für die Protokollierung oder andere Nutzungen) läßt jemand entscheiden (ein anderes Objekt oder das Objekt selbst), was zur Verfügung gestellt werden soll und wie sie angezeigt werden sollen. (Eine Strategie Muster nützlich sein können)

Andere Tipps

Es hängt von der indended Nutzung Ihrer Klasse. Viele Klassen haben keine natürlichen String-Darstellung (das heißt, eine Form-Objekt). Dann würde ich ToString als informative Methode (Form Text, Größe, usw.) sinnvoll umzusetzen, wenn das Debuggen. Wenn die Klasse Information an den Benutzer geben soll, dann würde ich ToString als Default-Darstellung des Wertes implementieren. Wenn Sie ein Vektorobjekt zum Beispiel, dann ToString könnte den Vektor als X zurückkehren und Y-Koordinate. Hier würde ich auch alternative Methoden hinzufügen, wenn es andere Möglichkeiten gibt, um die Klasse zu beschreiben. Also für den Vektor, ich könnte eine Methode hinzufügen, die eine Beschreibung als einen Winkel zurückgibt und eine Länge.

Für Debug-Zwecke können Sie auch das DebuggerDisplay Attribut zu Ihrer Klasse hinzuzufügen. Dies besagt, wie die Klasse im Debugger angezeigt werden, aber nicht die Stringdarstellung beeinflussen.

Sie können auch den Wert von ToString parseable sein zurück machen zu berücksichtigen, so dass Sie ein Objekt aus einem String-Darstellung erstellen können. Wie Sie mit dem Int32.Parse Methode tun können.

Ein weiteres Falten zu prüfen, ist die enge Integration zwischen ToString und Visual Studio-Debugger. Das Überwachungsfenster zeigt das Ergebnis von ToString als der Wert des Ausdrucks, so dass, wenn Ihre Methode jeden faul-Laden führt, hat keine Nebenwirkungen, oder dauert lange, dann können Sie seltsames Verhalten sehen oder der Debugger erscheinen hängen . Zugegeben, diese Eigenschaften sind nicht das Kennzeichen einer gut ToString-Methode entwickelt, aber sie passieren (zum Beispiel eines naiver „holt die Übersetzung aus der Datenbank“ Implementierung).

Folglich halte ich den Standard ToString-Methode (ohne Parameter) ein Visual Studio Debuggen Haken zu sein - mit der Implikation, dass es im Allgemeinen nicht für den Einsatz außerhalb eines Debugging-Kontextes durch das Programm überlastet werden soll.

Während die in Wissen nutzen, um die Debug-Attribute (DebuggerTypeProxyAttribute, DebuggerDisplayAttribute, DebuggerBrowsableAttribute) den Debugger anpassen, viele (mich eingeschlossen) betrachten im Allgemeinen die Standardausgabe als von ToString erzeugt und in den Uhr-Fenster angezeigt gut genug sein.

Ich verstehe, dass dies eine ziemlich strenge Perspektive ist - ToString als Debugger Haken abschreiben - aber ich finde, dass IFormattable Umsetzung scheint umso zuverlässige und erweiterbare Route zu sein

.

Ich persönlich nicht umsetzen ToString so oft. In vielen Fällen wäre es nicht viel Sinn machen, da eine Hauptrolle des Typs können sein Verhalten zu definieren, nicht Daten. In anderen Fällen ist es einfach keine Rolle, weil keine Kunden jemals brauchen.

In jedem Fall sind hier einige Fälle, in denen es sinnvoll ist (nicht erschöpfende Aufzählung):

  • Wenn das Ergebnis des ToString ohne Datenverlust wieder in eine Instanz des Typs analysiert denkbar werden.
  • Wenn der Typ hat einen einfachen (das heißt nicht komplex) Wert.
  • Wenn der Hauptzweck des Typs Formatdaten in Text.

Ich bin nicht einverstanden, dass es einen Konflikt zwischen den Nutzungsszenarien, die Sie auflisten. Wenn die Anzeige der Hauptzweck ist, sollte ToString einen benutzerfreundliche Text zur Verfügung stellen, aber für die Anmeldung (oder besser gesagt, wie Sie es beschreiben, für Tracing) Ich würde sagen, dass Sie sollten nicht ein UI-spezifisches Element in jedem Fall verfolgt, sondern ein Objekt, dessen Zweck es ist, detaillierte Trace-Daten zu schreiben.

So gibt es keinen Konflikt, weil es nicht die gleiche Art nach dem Single-Prinzip Verantwortung sein sollte.

Denken Sie daran, dass Sie immer die ToString-Methode überlasten, wenn Sie mehr Kontrolle benötigen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top