Hallo zusammen,
welchen Code würdet ihr bevorzugen?
string str = anyClass.Counter.ToString(); // 1
string str = "" + anyClass.Counter; // 2
Counter ist eine numerische Variable.
Danke & Gruß!
PS: Für mich sieht das erste logischer aus.
Beim zweiten hätte ich noch Bedenken, dass ein unnötiges Objekt erzeugt wird - oder optimiert der Compiler das weg?
Hallo,
ich würde definitiv Variante 1 bevorzugen, ich finde das besser lesbar.
Was der Compiler draus baut, ab ich mir nicht angeschaut - kann gut sein dass er genau das Gleiche aus beiden Varianten baut. Auch beim Jitter könnte das noch passieren.
Einen numerischen Wert zu einem Leerstring zu "addieren" fühlt sich für mich einfach falsch an.
Mal davon abgesehen, dass in der zweiten Variante ohnehin auch ToString auf dem Counter aufgerufen wird.
Gruß, MarsStein
Edit:
In neueren C#-Versionen kannst Du aich String interpolation nutzen, das ist auch eine schöne und gut lesbare Variante:
string str = $"{anyClass.Counter}"; // entspricht String.Format("{0}", anyClass.Counter);
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
der Compiler macht string.concat(object, object)
draus.
string str = "" + anyClass.Counter; // 2
wird zu
int c = anyClass.Counter;
object a = "";
object b = c;
string x = string.concat(a, b)
Im Falle desc
erfolgt noch ein boxing. IIRC wird damit object.ToString()
ausgeführt.
Die sauberere Variante ist auf alle Fälle ToString()
, da diese Methode im Hintergrund sowieso immer durch das concat ausgeführt wird.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Scheinbar macht der Compiler aus
string str = "" + Program.Counter;
sogar nur ...
string str = string.Concat(Program.Counter);
bzw der IL-Code:
call string [mscorlib]System.String::Concat(object)
Das macht das aber auch nicht viel besser.
Mit ...
string str = anyClass.Counter.ToString();
... bist du ganz gut aufgehoben 👍
http://dotnet-paderborn.azurewebsites.net/
Wobei hier noch ein Unterschied besteht, wenn Counter ein nullable ist.
Das ToString würde hier mit einer NullReference fliegen, das Concat nicht.
Wobei es glaube ich Definitionssache ist, ob man die Variable dann noch als numerisch bezeichnen kann 😉
-> Das nur der vollständigkeit halber.
Das ToString würde hier mit einer NullReference fliegen, das Concat nicht Führe bitte den nachfolgenden Code in einem Projekt aus und korrigiere dann deinen Beitrag.
try {
int? counter = null;
Console.WriteLine(counter.ToString());
}
catch (Exception x) {
Console.WriteLine(x.ToString());
}
Console.ReadKey();
Genau, die Exception fliegt nur bei Verweistypen, die null sind.
Nullable Types sind ja Structs, also ein Werttyp.
(nur die Syntax und IntelliSense können in diesem Fall verwirrend sein)