2010-05-31 4 views
3

Supposons que j'ai code suivant:ToString() est optimisé par le compilateur?

Console.WriteLine("Value1: " + SomeEnum.Value1.ToString() + "\r\nValue2: " + 
        SomeOtherEnum.Value2.ToString()); 

Will compilateur Optimize ceci:

Console.WriteLine("Value1: " + SomeEnum.Value1 + "\r\nValue2: " + 
         SomeOtherEnum.Value2); 

Je l'ai vérifié avec IL désassembleur et il y a des appels à IL_005a: callvirt instance string [mscorlib]System.Object::ToString()

Je don Je ne sais pas si JIT optimise cela.

+0

Il est tard et il me manque peut-être quelque chose, mais comment est-ce une optimisation? –

+0

@Jon Seigel J'évite d'écrire 'ToString()' où que je puisse l'éviter, juste pour taper moins, mais un ami a dit que c'était inutile, alors j'ai demandé ici d'enlever tous les doutes. – TheVillageIdiot

+0

Lorsque Value1 est de type string, le compilateur JIT peut optimiser les appels à ToString. – Steven

Répondre

3

Non, c'est l'inverse. Ce:

Console.WriteLine("Value1: " + SomeEnum.Value1 + "\r\nValue2: " + 
        SomeOtherEnum.Value2); 

est traduit par le compilateur dans (l'équivalent de) ceci:

string s = String.Concat("Value1: ", SomeEnum.Value1.ToString(), "\r\n Value2: ", SomeOtherEnum.Value2.ToString()); 
Console.WriteLine(s); 

Dans les deux cas, le même IL est généré. Si vous vous demandez si le JIT se que dans:

string s = String.Concat("Value1: ", "Value1", "\r\n Value2: ", "Value2"); 
Console.WriteLine(s); 

Ensuite, la réponse est non. Bien que je me demande pourquoi ce serait un problème pour vous?

+0

voir mon commentaire sur le commentaire de @Jon Seigel – TheVillageIdiot

+0

OK, eh bien quand même, les deux lignes que vous avez postées sont fondamentalement équivalentes. Si vous avez un outil comme ReSharper, il vous avertit lorsque les appels à ToString() sont redondants. Ce n'est pas qu'il y ait une baisse de performance, ce n'est tout simplement pas nécessaire. –

Questions connexes