38 votes

Ne mot-clé var en C# à cause de la boxe?

Mon patron m'interdit d'utiliser var qu'il serait la cause de la boxe et de ralentir l'application.

Est-ce vrai?

52voto

AakashM Points 32891

Une approche qui pourrait fonctionner est d'écrire ces deux méthodes:

public static void WithInt()
{
    int x = 5;
    Console.WriteLine(x);
}

public static void WithVar()
{
    var x = 5;
    Console.WriteLine(x);
}

Compiler et utiliser ildasm d'examiner le produit CIL. Montrer à votre patron.

edit @ck a fait tous, mais la dernière étape pour vous :)

37voto

cjk Points 27463

A la suite de Aakash réponse, voici la IL: (merci LINQPad)

WithInt:
IL_0000:  ldc.i4.5    
IL_0001:  stloc.0     
IL_0002:  ldloc.0     
IL_0003:  call        System.Console.WriteLine
IL_0008:  ret         

WithVar:
IL_0000:  ldc.i4.5    
IL_0001:  stloc.0     
IL_0002:  ldloc.0     
IL_0003:  call        System.Console.WriteLine
IL_0008:  ret      

32voto

Daniel Earwicker Points 63298

Pourquoi tant de personnes sont maudits avec les boss qui sont muets? Révolution, frères!

Votre patron a besoin de lire la documentation. var , le compilateur de déterminer le type de variable en regardant le type statique de l'expression d'initialisation. Il ne fait pas la moindre différence à l'exécution si vous spécifiez le type à la main, ou si vous utilisez var et laisser le compilateur figure it out pour vous.

Mise à jour Dans un commentaire sous la question, Hans Passant demande

pouvez-vous penser à d'var initialiseur que les causes de la boxe sans l'aide d'un casting?

Un exemple d'une expression que les forces de cette conversion, c'est:

var boxedInt = new Func<int, object>(n => n)(5);

Mais c'est juste identique à:

object boxedInt = new Func<int, object>(n => n)(5);

En d'autres termes, ce n'est pas vraiment rien avoir à faire avec var. Le résultat de mon initialiseur d'expression est - object, par conséquent var a utiliser que le type de la variable. Il ne pouvait pas être autre chose.

32voto

Brian Rasmussen Points 68853

Ce n'est pas vrai du tout.

var signifie simplement "chers compilateur, je sais de quel type est, et vous aussi, alors laissez-moi vous déplacer sur nous."

Elle rend le code plus court et certains trouvent cela plus lisible (les autres à trouver ça moins lisible), mais il n'y a pas de perte de performances que ce soit.

10voto

Daren Thomas Points 26812

Peut-être que votre patron est un ancien Visual Basic (comme dans <= 6.0) programmeur utilisé pour l' VARIANT type. Si vous n'avez pas à spécifier le type de la variable explicitement dans votre DIM déclaration, il a été un VARIANT qui est une sorte de union si je me souviens bien. Vous pouvez également voir cela comme une sorte de "boxe" et "unboxing" lors du passage de ces variables, de fonctions.

Parfois, les gens se confondre. Demandez à votre patron au sujet de son Visual Basic histoires de guerre. Écouter, d'apprendre et de gagner la sympathie en même temps! Quand vous quittez le bureau, vous pourriez remarquer que le compilateur c# les chiffres de ce genre de choses au moment de la compilation, et que "la boxe" n'est pas plus un problème.

Ne vous attendez pas à votre patron pour garder en place avec les derniers changements de langues/Api. Ce n'est pas d'être con. Il s'agit d'avoir d'autres choses à faire. Son travail, par exemple.

Edit: Comme indiqué dans les commentaires ci-dessous, si, en vous disant de ne pas utiliser var pour les mauvaises raisons est probablement pas son travail...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X