Javascript和c#中var实现的区别

本文关键字:实现 区别 var Javascript | 更新日期: 2023-09-27 18:17:22

我想问一个理论问题。例如,如果我在Page_load:

中有以下c#代码
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};
               // ...

问题:

  1. 此代码使用var关键字。这个构念的好处是什么?
  2. 在Javascript和c#中实现var的关键区别是什么?

Javascript和c#中var实现的区别

JavaScript是动态类型语言,而c#(通常)是静态类型语言。因此,这样的比较总是有问题的。但是:

JavaScript的var关键字有点类似于c#的dynamic关键字。两者都创建一个变量,其类型直到运行时才知道,并且直到运行时才发现其误用。这是JavaScript 总是的方式,但这种行为在c# 4中是全新的。

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

JavaScript没有任何东西可以与c#的var相匹配,因为JavaScript是一种动态类型语言,而c#的var,尽管普遍存在误解,创建了一个在编译时已知类型为的变量。c#的var有两个目的:声明类型难于写出的变量,以及创建匿名类型的变量,因此具有没有开发人员可以写出的类型。

第一个例子:

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

从linq到sql或实体框架的匿名类型投影是第二个很好的例子:

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

这里results的类型是IQueryable<SomeTypeTheCompilerCreatedOnTheFly>。无论您多么想写出结果的实际类型,而不是仅仅写var,都没有办法,因为您不知道编译器在幕后为您的匿名类型创建的类型-因此术语:该类型是anonymous

在这两种情况下,类型都是在编译时已知的,并且在这两种情况下,随后说

conn = new DateTime();

results = new DateTime();

将导致编译错误,因为您将connresults设置为与声明为的类型不兼容。

a) c#的var允许您避免在变量声明时编写显式类型。这使您的代码更加紧凑,而且有时声明右侧表达式的类型很复杂,同时您对实际类型是什么不感兴趣。

b) Javascript的var类似于c#的dynamic。它允许你声明一个变量,但是你可以改变它的类型。

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

它们唯一的共同点是都用来声明局部变量。

c#中等价于JS var的是dynamic。但是由于大多数c#用户更喜欢静态类型,它通常只用于某种类型的互操作场景(与COM或动态类型语言)。

c# var仍然使用静态类型,但是使用了推断类型。因为JS只支持动态类型,所以没有等价的

在这个上下文中,显式静态类型是不可能的,因为new {mft.CompanyID, mft.CompanyName}创建了一个匿名类型,所以使用var的隐式静态类型。

c#中的

var在设计时是动态的,但在编译时是静态类型的。你会看到,如果你这样做:

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

然后:

mftQuery = "Hello world!";

即使你没有指定任何类型,它也不会编译和抱怨不匹配的类型。

这是一个有用的生产力增强,因为您可以轻松地将返回类型更改为类似的类型,而不会破坏任何东西,并且更容易编写。一个愚蠢的例子:

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

可以改成:

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

要回答您的问题1,在所提供的代码中使用var关键字的好处是,可能很难得出LINQ查询的结果类型,并且很容易受到查询更改的影响。事实上,它在c#中的引入与LINQ的首次亮相是一致的。

重新计算,这是为了使程序员的生活更容易,也消除了Type t = new Type()的冗余。