Einige (Geschwindigkeits-)Leistungstests, die die verschiedenen Optionen zusammenfassen, nicht dass es wirklich wichtig ist #mikrooptimierung (Verwendung einer linqpad extension)
Optionen
void Main()
{
object objValue = null;
test(objValue);
string strValue = null;
test(strValue);
}
// Definieren anderer Methoden und Klassen hier
void test(string value) {
new Perf {
{ "coalesce", n => (value ?? string.Empty).ToString() },
{ "nullcheck", n => value == null ? string.Empty : value.ToString() },
{ "str.Format", n => string.Format("{0}", value) },
{ "str.Concat", n => string.Concat(value) },
{ "string +", n => "" + value },
{ "Convert", n => Convert.ToString(value) },
}.Vs();
}
void test(object value) {
new Perf {
{ "coalesce", n => (value ?? string.Empty).ToString() },
{ "nullcheck", n => value == null ? string.Empty : value.ToString() },
{ "str.Format", n => string.Format("{0}", value) },
{ "str.Concat", n => string.Concat(value) },
{ "string +", n => "" + value },
{ "Convert", n => Convert.ToString(value) },
}.Vs();
}
Wahrscheinlich wichtig zu beachten ist, dass Convert.ToString(...)
eine Nullzeichenfolge beibehalten wird.
Ergebnisse
Objekt
- nullcheck 1.00x 1221 Ticks vergangen (0.1221 ms) [in 10K Durchläufen, 1.221E-05 ms pro]
- coalesce 1.14x 1387 Ticks vergangen (0.1387 ms) [in 10K Durchläufen, 1.387E-05 ms pro]
- string + 1.16x 1415 Ticks vergangen (0.1415 ms) [in 10K Durchläufen, 1.415E-05 ms pro]
- str.Concat 1.16x 1420 Ticks vergangen (0.142 ms) [in 10K Durchläufen, 1.42E-05 ms pro]
- Convert 1.58x 1931 Ticks vergangen (0.1931 ms) [in 10K Durchläufen, 1.931E-05 ms pro]
- str.Format 5.45x 6655 Ticks vergangen (0.6655 ms) [in 10K Durchläufen, 6.655E-05 ms pro]
Zeichenkette
- nullcheck 1.00x 1190 Ticks vergangen (0.119 ms) [in 10K Durchläufen, 1.19E-05 ms pro]
- Convert 1.01x 1200 Ticks vergangen (0.12 ms) [in 10K Durchläufen, 1.2E-05 ms pro]
- string + 1.04x 1239 Ticks vergangen (0.1239 ms) [in 10K Durchläufen, 1.239E-05 ms pro]
- coalesce 1.20x 1423 Ticks vergangen (0.1423 ms) [in 10K Durchläufen, 1.423E-05 ms pro]
- str.Concat 4.57x 5444 Ticks vergangen (0.5444 ms) [in 10K Durchläufen, 5.444E-05 ms pro]
- str.Format 5.67x 6750 Ticks vergangen (0.675 ms) [in 10K Durchläufen, 6.75E-05 ms pro]
3 Stimmen
Ich sehe nichts falsch am ersten. Wenn du den zweiten als Hack betrachtest, ist es am besten, einfach eine Hilfsfunktion zu schreiben, die die Nullprüfung durchführt.
0 Stimmen
Bitte sei genauer mit deiner Frage.
3 Stimmen
String.Format("{0}", myObj) akzeptiert Nullwerte.
3 Stimmen
Mit C# 6.0 können wir nun Null-Bedingungsoperatoren verwenden, wie z.B. theText?.ToString() oder theText?.Trim()
2 Stimmen
Laut dieser Antwort macht
Convert.ToString()
genau das, was du als Erstes geschrieben hast.0 Stimmen
Für die Vervollständigung würde ich darauf hinweisen, dass die Frage und Antworten nur auf Referenztypen verweisen, aber nicht auf "einfache" Nullable - was eine Struktur ist, und Methoden können auf leeren Strukturen problemlos aufgerufen werden. Diese 2 anderen Fragen sind verwandt: 1 & 2.