Dies ist nicht wirklich ein Problem, aber ich bin neugierig. Wenn ich eine Zeichenfolge in einer DataRow speichere, wird sie in Object umgewandelt. Wenn ich es verwenden möchte, muss ich es in ToString umwandeln. Soweit ich weiß, gibt es verschiedene Möglichkeiten, dies zu tun
string name = (string)DataRowObject["name"]; //valid since I know it's a string
und eine andere ist:
string name = DataRowObject["name"].ToString();
Mich interessiert, was ist der Unterschied zwischen beiden? Ist der erste effizienter? (Dies ist nur eine Spekulation, in meinem Kopf wird die ToString () -Methode durch einen Schleifenmechanismus implementiert, bei dem das Casting "schneller" sein könnte, dies ist jedoch nur ein "Bauchgefühl", das ich habe).
Gibt es dafür noch eine schnellere / elegantere Möglichkeit?
Kann jemand das für mich klären?
Antworten:
von http://www.codeguru.com/forum/showthread.php?t=443873
Siehe auch http://bytes.com/groups/net-c/225365-tostring-string-cast
quelle
Wenn Sie wissen, dass es ein ist,
String
dann werfen Sie es auf jeden Fall zu einemString
. Das Casting Ihres Objekts ist schneller als das Aufrufen einer virtuellen Methode.Bearbeiten: Hier sind die Ergebnisse einiger Benchmarking:
============ Casting vs. virtual method ============ cast 29.884 1.00 tos 33.734 1.13
Ich habe Jon Skeet
BenchmarkHelper
so benutzt:using System; using BenchmarkHelper; class Program { static void Main() { Object input = "Foo"; String output = "Foo"; var results = TestSuite.Create("Casting vs. virtual method", input, output) .Add(cast) .Add(tos) .RunTests() .ScaleByBest(ScalingMode.VaryDuration); results.Display(ResultColumns.NameAndDuration | ResultColumns.Score, results.FindBest()); } static String cast(Object o) { return (String)o; } static String tos(Object o) { return o.ToString(); } }
Es scheint also, dass das Casting tatsächlich etwas schneller ist als das Anrufen
ToString()
.quelle
Grundsätzlich ist es in Ihrem Fall besser, die Typumwandlung zu belassen, da .ToString () Fehler verbergen kann. Beispielsweise wurde Ihr Datenbankschema geändert und der Name ist nicht mehr vom Typ Zeichenfolge, aber mit .ToString () funktioniert Ihr Code weiterhin. In diesem Fall ist es daher besser, Typguss zu verwenden.
Hier ist die Implementierung von String.ToString () - nichts Besonderes =)
public override string ToString() { return this; }
quelle
Downcasting ist eine relativ langsame Operation, da CLR verschiedene Laufzeit-Typprüfungen durchführen muss. Doch in diesem speziellen Szenario Gießen
string
besser geeignet ist als AufrufToString()
aus Gründen der Konsistenz (man kann nicht rufenToInt32
aufobject
, sondern warf es aufint
) und maintanability.quelle
Ich möchte noch einen Kommentar abgeben
Wenn Sie Casting verwenden möchten: string name = (string) DataRowObject ["name"], erhalten Sie eine Ausnahme: Objekt vom Typ 'System.DBNull' kann nicht in 'System.String' umgewandelt werden, falls der Datensatz in Die Datenbanktabelle hat den Wert Null.
In diesem Szenario müssen Sie Folgendes verwenden: string name = DataRowObject ["name"]. ToString () oder
Sie müssen nach Nullwerten wie suchen
if(!string.IsNullOrEmpty(DataRowObject["name"].ToString())) { string name = (string)DataRowObject["name"]; } else { //i.e Write error to the log file string error = "The database table has a null value"; }
quelle
Für Datenobjekte empfehle ich Ihnen, das Schlüsselwort "as" wie den folgenden Code zu verwenden.
string name = DataRowObject["name"] as string;
Bitte überprüfen Sie dies, bevor Sie den Wert verwenden.
if(name != null) { // statement for empty string or it has value } else { // statement for no data in this object. }
quelle
string name = (row["name"] as string) ?? "default";
In diesem Fall:
string name = DataRowObject["name"].ToString();
da es ein ist
string
, denke ich, dass dieToString()
Methode eines String-Objekts einfach ist wie:return this;
IMHO gibt es also keine Leistungseinbußen.
PS Ich bin ein Java-Programmierer, daher ist diese Antwort nur eine Vermutung.
quelle
ToString () führt standardmäßig keine Umwandlung durch. Der Zweck besteht darin, eine Zeichenfolge zurückzugeben, die den Typ darstellt (z. B. "System.Object").
Wenn Sie Casting vermeiden möchten, können Sie versuchen, sich eine Implementierung vorzustellen, die stark typisiert ist (z. B. mithilfe von Generika) und DataRowObject insgesamt vermeidet.
quelle
Ich weiß, dass Sie erwähnt haben, dass das Objekt eine Zeichenfolge ist, aber falls Sie befürchten, dass das zurückgegebene Objekt null ist, können Sie es auch mit "Convert.ToString (DataRowObject [" name "]);" Dies hat den zusätzlichen Vorteil, dass eine leere Zeichenfolge (string.empty) zurückgegeben wird, wenn das Objekt null ist, um Nullreferenzausnahmen zu vermeiden (es sei denn, Sie möchten in solchen Fällen natürlich eine Ausnahme auslösen).
quelle