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};
// ...
问题:
- 此代码使用
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();
将导致编译错误,因为您将conn
和results
设置为与声明为的类型不兼容。
a) c#的var
允许您避免在变量声明时编写显式类型。这使您的代码更加紧凑,而且有时声明右侧表达式的类型很复杂,同时您对实际类型是什么不感兴趣。
b) Javascript的var
类似于c#的dynamic
。它允许你声明一个变量,但是你可以改变它的类型。
var i = 1;
i = "foo"; // legal in Javascript, illegal in C#
它们唯一的共同点是都用来声明局部变量。
c#中等价于JSvar
的是dynamic
。但是由于大多数c#用户更喜欢静态类型,它通常只用于某种类型的互操作场景(与COM或动态类型语言)。
c# var
仍然使用静态类型,但是使用了推断类型。因为JS只支持动态类型,所以没有等价的
在这个上下文中,显式静态类型是不可能的,因为new {mft.CompanyID, mft.CompanyName}
创建了一个匿名类型,所以使用var
的隐式静态类型。
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()
的冗余。