Es scheint wie eine gute Design-Entscheidung, dass die System.Object
Klasse und damit alle Klassen in .NET eine ToString()
-Methode zur Verfügung stellen, die, nicht überraschend, eine String-Darstellung des Objekts zurückgibt. Zusätzlich ist diese Methode in C# für native Typen implementiert, so dass sie sich gut in das Typsystem integrieren lassen.Warum gibt es keine inverse zu object.ToString()?
Dies ist oft nützlich, wenn Benutzerinteraktion erforderlich ist. Zum Beispiel können Objekte direkt in GUI-Widgets wie Listen gehalten werden und werden "automatisch" als Text angezeigt.
Was ist das Grundprinzip im Sprachdesign, um keine ähnlich allgemeine object.FromString(string)
Methode zur Verfügung zu stellen?
Andere Fragen und ihre Antworten diskutieren mögliche Einwände, aber ich finde sie nicht überzeugend.
konnte der Parse ausfallen, während eine Umwandlung in String immer möglich ist.
Nun, das nicht hält
Parse()
Methoden aus bestehenden, nicht wahr? Wenn die Ausnahmebehandlung als unerwünschtes Design betrachtet wird, könnte man immer noch eineTryParse()
Methode definieren, deren Standardimplementierung fürSystem.Object
einfach false zurückgibt, die aber für konkrete Typen überschrieben wird, wo es sinnvoll ist (z. B. die Typen, bei denen diese Methode heute ohnehin existiert).Alternativ auf einem Minimum würde es schön sein, eine
IParseable
Schnittstelle zu haben, die ein oderParseMe()
TryParse()
Verfahren erklärt, nach dem Vorbild derICloneable
.
Kommentar von Tim Schmelter des "Roll your own": Das funktioniert natürlich. Aber ich kann nicht allgemeinen Code für native Typen schreiben oder, sagen wir,
IPAddress
, wenn ich die Werte analysieren muss; Stattdessen muss ich auf Introspektion zurückgreifen oder Wrapper schreiben, die eine selbstdefinierte Schnittstelle implementieren, die entweder wartungsunfreundlich oder langwierig und fehleranfällig ist.Kommentar von Damien: Eine Schnittstelle kann nur nicht statische Funktionen aus Gründen begründen, die von Eric Lippert here diskutiert werden. Dies ist ein sehr stichhaltiger Einwand. Eine statische Methode
TryParse()
kann in einer Schnittstelle nicht angegeben werden. Eine virtuelleParseMe(string)
Methode benötigt jedoch ein Dummy-Objekt, das bestenfalls ein Kludge ist und im schlimmsten Fall unmöglich ist (mit RAII). Ich vermute fast, dass dies der Hauptgrund dafür ist, dass eine solche Schnittstelle nicht existiert. Stattdessen gibt es das ausgeklügelte Typumwandlungs-Framework, eine der Alternativen, die als Lösungen für das "statische Interface" -Oxymoron erwähnt wurden.
Aber auch die Einwände aufgeführt gegeben, da das Fehlen einer allgemeinen Parsing-Anlage in das Typsystem oder Sprache erscheint mir als eine peinliche Asymmetrie, dass eine allgemeine ToString()
Methode existiert und äußerst nützlich ist.
Wurde das jemals während des Sprach/CLR-Designs diskutiert?
Damit "IParsable" funktioniert, müssen Sie zuerst eine Instanz anfordern. Wenn das Problem darin besteht, "diese Zeichenkette in eine Instanz von X zu verwandeln", ist es etwas peinlich, dass Sie zuerst eine andere Instanz von X erhalten müssen, damit Sie 'FromString()' darauf aufrufen können. –
Was genau wäre das Standardverhalten dafür, nur eine Ausnahme werfen? – juharr
Sie können nur wenige Typen von String in 'OtherType' konvertieren, aber Sie können jeden Typ in' String' konvertieren. Was bringt das? Sie können immer eine Konstruktor- oder Factory-Methode angeben (z. B. mit 'TryParse'-Muster), die eine Instanz aus einer Zeichenfolge erzeugt, wenn dies gewünscht und möglich ist. –