27 votes

Différence entre l'implémentation de var en Javascript et C#

Je voudrais poser une question théorique. Si j'ai, par exemple, le code C# suivant dans Page_load :

cars = new carsModel.carsEntities();

var mftQuery = from mft in cars.Manufacturers 
               where mft.StockHeaders.Any(sh=> sh.StockCount>0) 
               orderby mft.CompanyName 
               select new {mft.CompanyID, mft.CompanyName};
               // ...

Questions :

  1. Ce code utilise le var mot-clé. Quel est l'avantage de cette construction ?
  2. Quelle est la principale différence entre la mise en œuvre de var en Javascript et C# ?

74voto

Adam Rackis Points 45559

JavaScript est un langage à typage dynamique, tandis que c# est (généralement) un langage à typage statique. Par conséquent, les comparaisons de ce type seront toujours problématiques. Mais :

JavaScript var est quelque peu similaire au mot-clé C# dynamic mot-clé. Tous deux créent une variable dont le type ne sera pas connu avant l'exécution, et dont l'utilisation abusive ne sera pas découverte avant l'exécution. C'est de cette façon que JavaScript toujours est, mais ce comportement est tout nouveau dans C# 4.

dynamic foo = new DateTime();
foo.bar();  //compiles fine but blows up at runtime.

JavaScript n'a rien à envier à C# var puisque JavaScript est un langage à typage dynamique, et que le langage C# est un langage à typage dynamique. var crée, malgré les idées reçues, une variable dont le type est connu au moment de la compilation . C# var sert à deux fins : déclarer des variables dont le type est difficile à écrire, et créer des variables de type anonyme, et par conséquent ont aucun type qui puisse être écrit par le développeur.

Pour un exemple de la première :

var conn = new System.Data.SqlClient.SqlConnection("....");

Les projections de type anonyme de Linq-to-Sql ou Entity Framework sont un bon exemple du second :

var results = context.People.Where(p => p.Name == "Adam")
                            .Select(p => new { p.Name, p.Address });

Aquí results est de type IQueryable<SomeTypeTheCompilerCreatedOnTheFly> . Même si vous souhaitez écrire le type de résultats, au lieu de simplement écrire var il n'y a aucun moyen de le faire puisque vous n'avez aucune connaissance du type que le compilateur crée sous le couvert de votre type anonyme - d'où la terminologie : ce type est anonyme

Dans les deux cas, le type est connu à temps de compilation et, dans les deux cas, en disant ensuite soit

conn = new DateTime();

ou

results = new DateTime();

entraînerait une erreur de compilation puisque vous êtes en train de mettre conn y results à un type qui n'est pas compatible avec ce qu'ils étaient déclaré comme .

9voto

Wiktor Zychla Points 23918

A) C# var vous permet d'éviter d'écrire un type explicite lors de la déclaration d'une variable. Cela rend votre code plus compact, car parfois le type de l'expression à droite de la déclaration est compliqué et en même temps vous n'êtes pas intéressé par le type réel.

b) Javascript var est comme le C# dynamic . Il vous permet de déclarer une variable mais vous pouvez changer son type.

var i = 1; 
i = "foo";  // legal in Javascript, illegal in C#

6voto

CodesInChaos Points 60274

La seule chose qu'ils ont en commun est qu'ils sont utilisés pour déclarer des variables locales.

L'équivalent C# de JS var est dynamic . Mais comme la plupart des utilisateurs de C# préfèrent le typage statique, il n'est généralement utilisé que dans des scénarios d'interopérabilité de quelque nature (avec COM ou un langage à typage dynamique).

C# var utilise toujours le typage statique, mais avec un type inféré. Comme JS ne supporte que le typage dynamique, il n'y a pas d'équivalent.

Dans ce contexte, le typage statique explicite n'est pas possible, puisque new {mft.CompanyID, mft.CompanyName} crée un type anonyme Ainsi, le typage statique implicite avec var est utilisé.

1voto

Mikael Eliasson Points 2962

En C#, la variable est dynamique au moment de la conception mais statiquement typée au moment de la compilation. Vous le verrez si vous le faites :

var mftQuery = from mft in cars.Manufacturers
    where mft.StockHeaders.Any(sh=> sh.StockCount>0) 
    orderby mft.CompanyName
    select new {mft.CompanyID, mft.CompanyName};

et ensuite :

mftQuery = "Hello world!";

Il ne compilera pas et se plaindra de l'incompatibilité des types, même si vous n'avez spécifié aucun type.

Il s'agit d'une amélioration utile de la productivité, car vous pouvez facilement remplacer les types de retour par des types similaires sans rien casser et en simplifiant l'écriture. Un exemple stupide :

foreach(var animal in GetCats()){
   Console.WriteLine(animal.Owner);
}

pourrait être changé en :

foreach(var animal in GetDogs()){
   Console.WriteLine(animal.Owner);
}

0voto

Krizz Points 7273

Et pour répondre à votre question 1 l'avantage d'utiliser var dans le code présenté est à peut être difficile de trouver le type résultant pour la requête LINQ et peut être facilement affecté par la modification de la requête. En fait, son introduction dans C# coïncide avec la première de LINQ.

En supposant, c'est pour faciliter la vie du programmeur et aussi pour supprimer la redondance de l'information. Type t = new Type() .

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