C# Javascript和C中var实现的差异#
我想问一个理论问题。例如,如果我在页面加载中有以下C代码:C# Javascript和C中var实现的差异#,c#,javascript,.net,linq,var,C#,Javascript,.net,Linq,Var,我想问一个理论问题。例如,如果我在页面加载中有以下C代码: cars = new carsModel.carsEntities(); var mftQuery = from mft in cars.Manufacturers where mft.StockHeaders.Any(sh=> sh.StockCount>0) orderby mft.CompanyName select ne
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
关键字。这种构造的好处是什么var
的关键区别是什么JavaScript是一种动态类型语言,而c#通常是一种静态类型语言。因此,像这样的比较总是有问题的。但是: JavaScript的
var
关键字与C#的dynamic
关键字有些相似。这两种方法都会创建一个变量,该变量的类型在运行时之前是未知的,并且在运行时之前不会发现其误用。JavaScript总是这样,但这种行为对C#4来说是全新的
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 });
此处的结果
类型为IQueryable
。无论您多么希望写出结果的实际类型,而不是仅仅编写var
,都无法做到这一点,因为您不知道编译器在匿名类型的封面下创建的类型,因此术语为:此类型为匿名
在这两种情况下,类型都是在编译时已知的,并且在这两种情况下,随后都表示
conn = new DateTime();
或
将导致编译器错误,因为您正在将
conn
和results
设置为与声明为的类型不兼容的类型 它们唯一的共同点是用于声明局部变量
JSvar
的C#等价物为。但是,由于大多数C#用户更喜欢静态类型,它通常只用于某种互操作场景(使用COM或动态类型语言)
仍然使用静态类型,但使用推断类型。因为JS只支持动态类型,所以没有等效的
在这种情况下,显式静态类型是不可能的,因为new{mft.CompanyID,mft.CompanyName}
创建了一个变量,所以使用var
的隐式静态类型。a)C#的var
可以避免在声明变量时编写显式类型。这使代码更加紧凑,有时声明右侧的表达式类型很复杂,同时您对实际类型不感兴趣
b) Javascript的var
类似于C的dynamic
。它允许您声明变量,但您可以更改其类型
var i = 1;
i = "foo"; // legal in Javascript, illegal in C#
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的首映是一致的
再者,这是为了让程序员的生活更轻松,也为了消除冗余的
typet=newtype()
你不妨问一下英语中的“die”和德语中的“die”之间的区别。一个是动词to death和dice的单数,另一个是冠词和代词(在这两种情况下,我只选择了两种常见的含义,当然还有更多)。它们是完全不同的东西(它们甚至有不同的发音),写下来的时候看起来是一样的。类似于C#和JS中的var
。答案很好!如果微软使用“推断”这个词而不是“var”,那会更准确,但为了简洁起见,我认为他们选择了正确的一个。经过这么多年,与其他开发技术相比,.NET是多么优雅,这仍然让我感到惊讶。我猜是微软的开发团队不得不自己吃狗粮。顺便说一句,如果你使用Resharper,var的工作方式会立即变得明显。@Joel,谢谢你,是的,我觉得C#非常优雅。Eric Lippert和他的公司做得很好。@Joel:C#的唯一问题是它是基于C的,因此带来了许多来自C的糟糕语法选择。当然,如果它不是基于C的,它的采用率不会接近,所以这是正确的选择。。。这是编程协会的一个问题,而不是C#-设计器的一个错误:\此外,JavaScript中的var关键字对变量类型没有任何作用,但它确实影响变量范围。未声明var的变量将成为全局变量。用var关键字声明的是local(在JavaScript中,这是函数作用域,而不是块作用域)。@Johan-非常正确。C#对于隐式全局变量没有等价物。你说的“设计时”是什么意思?
foreach(var animal in GetCats()){
Console.WriteLine(animal.Owner);
}
foreach(var animal in GetDogs()){
Console.WriteLine(animal.Owner);
}