Es ist immer angemessen, aber überlegen Sie genau, welche Absichten hinter dem stehen, was Sie anzeigen
Eine bessere Frage wäre zu fragen:
Warum sollte man ToString () überschreiben?
ToString () ist das Fenster in den Status eines Objekts. Betonung des Staates als Voraussetzung. Stark OOP-Sprachen wie Java / C # missbrauchen das OOP-Modell, indem sie alles in einer Klasse kapseln. Stellen Sie sich vor, Sie codieren in einer Sprache, die nicht dem starken OOP-Modell folgt. Überlegen Sie, ob Sie eine Klasse oder eine Funktion verwenden möchten. Wenn Sie es als Funktion verwenden würden (dh Verb, Aktion) und der interne Status nur vorübergehend zwischen Eingabe / Ausgabe beibehalten wird, bietet ToString () keinen Mehrwert.
Wie bereits erwähnt, ist es wichtig zu berücksichtigen, was Sie mit ToString () ausgeben, da es vom Debugger oder anderen Systemen verwendet werden kann.
Ich stelle mir die ToString-Methode gerne als den Parameter --help eines Objekts vor. Es sollte kurz, lesbar, offensichtlich und leicht anzuzeigen sein. Es sollte anzeigen, was das Objekt ist nicht das, was es tut . In Anbetracht dessen betrachten wir ...
Anwendungsfall - Analysieren eines TCP-Pakets:
Keine Netzwerkerfassung nur auf Anwendungsebene, sondern etwas mit mehr Fleisch wie eine PCC-Erfassung.
Sie möchten ToString () nur für die TCP-Schicht überladen, damit Sie Daten auf der Konsole drucken können. Was würde es beinhalten? Sie könnten verrückt werden und alle TCP-Details analysieren (dh TCP ist komplex) ...
Welches beinhaltet die:
- Quellport
- Zielhafen
- Sequenznummer
- Bestätigungsnummer
- Datenoffset
- Flaggen
- Fensterversatz
- Prüfsumme
- Dringender Zeiger
- Optionen (Ich werde nicht einmal dorthin gehen)
Aber möchten Sie all diesen Müll empfangen, wenn Sie TCP.ToString () für 100 Pakete aufrufen? Natürlich nicht, es wäre Informationsüberflutung. Die einfache und offensichtliche Wahl ist auch die sinnvollste ...
Zeigen Sie auf, was die Leute erwarten würden:
Ich bevorzuge eine vernünftige Ausgabe, die für Menschen leicht zu analysieren ist, aber YMMV .
TCP:[destination:000, source:000]
Nichts Komplexes, die Ausgabe ist nicht für Maschinen zum Parsen (dh es sei denn, die Leute missbrauchen Ihren Code), der beabsichtigte Zweck ist die menschliche Lesbarkeit.
Aber was ist mit all dem Rest dieser saftigen Informationen, über die ich vorher gesprochen habe, ist das nicht auch nützlich? Ich werde darauf kommen, aber zuerst ...
ToString () ist eine der wertvollsten und am wenigsten genutzten Methoden aller Zeiten
Aus zwei Gründen:
- Die Leute verstehen nicht, wofür ToString () ist
- In der Basisklasse 'Object' fehlt eine andere, ebenso wichtige String-Methode.
Grund 1 - Missbrauche nicht die Nützlichkeit von ToString ():
Viele Leute verwenden ToString (), um eine einfache Zeichenfolgendarstellung eines Objekts abzurufen. Das C # -Handbuch besagt sogar:
ToString ist die wichtigste Formatierungsmethode in .NET Framework. Es konvertiert ein Objekt in seine Zeichenfolgendarstellung, sodass es für die Anzeige geeignet ist.
Anzeige, keine Weiterverarbeitung. Das bedeutet nicht, dass ich meine schöne Zeichenfolgendarstellung des obigen TCP-Pakets nehme und den Quellport mit einem regulären Ausdruck :: cringe :: ziehe.
Das Recht Weg, dies zu tun, besteht darin, ToString () direkt in der SourcePort-Eigenschaft aufzurufen (was übrigens ein ushort ist, sodass ToString () bereits verfügbar sein sollte).
Wenn Sie etwas Robusteres benötigen, um den Status eines komplexen Objekts für die Computeranalyse zu verpacken, sollten Sie eine strukturierte Serialisierungsstrategie verwenden.
Glücklicherweise sind solche Strategien sehr verbreitet:
- ISerialisierbar (C #)
- Gurke (Python)
- JSON (Javascript oder eine andere Sprache, die es implementiert)
- SEIFE
- etc...
Hinweis: Es sei denn, Sie verwenden PHP, da es für Herp-Derp eine Funktion gibt: snicker ::
Grund 2 - ToString () reicht nicht aus:
Ich habe noch keine Sprache gesehen, die dies im Kern implementiert, aber ich habe Variationen dieses Ansatzes in freier Wildbahn gesehen und verwendet.
Einige davon sind:
- ToVerboseString ()
- ToString (ausführlich = wahr)
Im Grunde genommen, dass haarigen Sie einen Staates TCP Packet sollten für die menschliche Lesbarkeit beschrieben. Um zu vermeiden, dass ein totes Pferd über TCP gesprochen wird, zeige ich mit dem Finger auf den ersten Fall, in dem ToString () und ToVerboseString () meiner Meinung nach nicht ausreichend genutzt werden ...
Anwendungsfall - Arrays:
Wenn Sie hauptsächlich eine Sprache verwenden, sind Sie wahrscheinlich mit dem Ansatz dieser Sprache vertraut. Für Leute wie mich, die zwischen verschiedenen Sprachen wechseln, kann die Anzahl der unterschiedlichen Ansätze irritierend sein.
Das heißt, die Häufigkeit, mit der mich dies irritiert hat, ist größer als die Summe aller Finger jedes hinduistischen Gottes zusammen.
Es gibt verschiedene Fälle, in denen Sprachen gängige Hacks verwenden und einige , die es richtig machen . Einige müssen neu erfunden werden, andere machen einen flachen Dump, andere machen einen tiefen Dump, keiner von ihnen funktioniert so, wie ich es gerne hätte ...
Was ich verlange, ist ein sehr einfacher Ansatz:
print(array.ToString());
Ausgaben: 'Array [x]' oder 'Array [x] [y]'
Wobei x die Anzahl der Elemente in der ersten Dimension und y die Anzahl der Elemente in der zweiten Dimension oder ein Wert ist, der angibt, dass die zweite Dimension gezackt ist (Min / Max-Bereich möglicherweise?).
Und:
print(array.ToVerboseString());
Gibt den ganzen She-Bang in hübschem Druck aus, weil ich hübsche Dinge schätze.
Hoffentlich wirft dies ein Licht auf ein Thema, das mich schon lange geärgert hat. Zumindest habe ich den PHPern einen kleinen Trollköder gestreut, um diese Antwort abzulehnen.
Console.WriteLine(obj.GetToStringItemsHeadings); Console.WriteLine(obj);
oder ähnlichem ausgeben .