tags:

views:

205

answers:

5

I have a statement where a string is assigned in the following manner:

for(int i = 0; i < x; i++) {
  Foo.MyStringProperty = "Bar_" + i.ToString();
  [...]
}

Are there any performance differences between i.ToString() or just plain i, as both are just converted to the (culture invariant?) string equivalent?

nb. I am well aware of the existence of String.Concat(), String.Format, StringBuilder etc., but for the sake of this case, lets assume I may only use + concatenation.

Thanks in advance.

+7  A: 

Just using string + object forces a call to ToString() on the object - it's equivalent to calling it explicitly.

Aviad P.
@Aviad: There's a difference in timing, however - which affects whether the value is boxed or not.
Jon Skeet
+1  A: 

I would use .ToString() out of habit and readability, I am sure you will find better performance saving elsewhere.

Mark Redman
+8  A: 

+ concatenation uses String.Concat anyway - String itself doesn't expose a + operator.

So for example:

int i = 10;
string x = "hello" + i;

is compiled into:

int i = 10;
object o1 = "hello";
object o2 = i; // Note boxing
string x = string.Concat(o1, o2);

Whereas calling ToString directly will avoid boxing and call the Concat(string, string) overload. Therefore the version with the ToString call will be slightly more efficient - but I highly doubt that it'll be significant, and I'd strongly urge you to go with whichever version you feel is more readable.

Jon Skeet
Thanks, very clear answer. Though I'd be tempted to accept divo's comment if it were an answer instead, because of his caveat about the culture info.
Webleeuw
In my testing the boxing and unboxing of a value type when NOT using the ToString method causes about a 2.5% performance hit.
Firestrand
+3  A: 

Hi!

ToString is the default method used to write an object. So, if you use "i" or "i.ToString()" is the same thing.

If you know a little about operator overloading in c++ you can understand how "+" works in this case.

using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Text;


public class MainClass
{
    public static void Main()
    {
        int number = 10;
        string msg = "age is " + number + ".";
        msg += " great?";
        Console.WriteLine("msg: {0}", msg);

        String s1 = 10 + 5 + ": Two plus three is " + 2 + 3;
        String s2 = 10 + 5 + ": Two plus three is " + (2 + 3);
        Console.WriteLine("s1: {0}", s1);
        Console.WriteLine("s2: {0}", s2);    }

}

Result: msg: age is 10. great?

s1: 15: Two plus three is 23

s2: 15: Two plus three is 5

Guilherme Ferreira

http://guilhermeferreira.wordpress.com/

Guilherme Ferreira
A: 
for(int i = 0; i < x; i++) {
  Foo.MyStringProperty = "Bar_" + i.ToString();
  [...]
}

Since here your resultant is in string and i is int , so "Bar_"+ i be concatenated and will call .ToString() for object to get attached with a string. regarding performance you can use some performance measurement tools

I generally use casting , if i have two diff objects

Amit Ranjan
vote good or bad if it solves your problem
Amit Ranjan