Javascript和C#中var的实现差异

dal*_*985 30 .net javascript c# linq var

我想问一个理论问题.例如,如果我有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};
               // ...
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 此代码使用var关键字.这种结构有什么好处?
  2. var在Javascript和C#中实现的关键区别是什么?

Ada*_*kis 78

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

JavaScript的var关键字有点类似于C#的dynamic关键字.两者都创建一个变量,其类型在运行时才会被识别,并且直到运行时才会发现其误用.这是JavaScript 一直以来的方式,但这种行为对C#4来说是全新的.

dynamic foo = new DateTime();
foo.bar();  //compiles fine but blows up at runtime.
Run Code Online (Sandbox Code Playgroud)

JavaScript没有任何东西可以匹配C#var,因为JavaScript是一种动态类型语言var,尽管流行的误解,C#创建了一个类型在编译时已知的变量.C#的var有两个目的:声明变量,其类型是一个痛苦写出来,并创建是一个匿名类型的变量,因此,没有类型,可以由开发者写出.

以第一个为例:

var conn = new System.Data.SqlClient.SqlConnection("....");
Run Code Online (Sandbox Code Playgroud)

来自Linq-to-Sql或Entity Framework的匿名类型投影是第二个的一个很好的例子:

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

results是类型IQueryable<SomeTypeTheCompilerCreatedOnTheFly>.无论你多么想写出实际的结果类型,而不仅仅是写作var,都没有办法,因为你不知道编译器在你的匿名类型的封面下创建的类型 - 因此术语:这种类型是匿名的

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

conn = new DateTime();
Run Code Online (Sandbox Code Playgroud)

要么

results = new DateTime();
Run Code Online (Sandbox Code Playgroud)

将导致编译器错误,因为你设置connresults的类型,这不是跟他们有什么兼容的声明.

  • 此外,JavaScript中的var关键字对变量类型不起任何作用,但它确实会影响变量范围.声明为var的变量成为全局变量.用var关键字声明的是local(在JavaScript中,即函数作用域,而不是块作用域). (11认同)
  • 很棒的答案!如果微软使用推词而不是var,那将更准确,但为了简洁起见,我认为他们选择了正确的.经过这么多年,我仍然惊讶于.NET与其他开发技术的优雅程度.我猜这是微软开发团队不得不吃自己的狗粮.顺便说一句,如果你使用Resharper,var的工作方式就会立即显现出来. (9认同)
  • @Joel,谢谢,是的,我发现C#非常优雅.Eric Lippert和公司做得很好. (3认同)

Wik*_*hla 10

a)C#var允许你避免在变量声明时写一个显式类型.这使得您的代码更紧凑,有时候声明右侧的表达式类型也很复杂,同时您对实际类型不感兴趣.

b)Javascript var就像C#一样dynamic.它允许您声明变量,但您可以更改其类型.

var i = 1; 
i = "foo";  // legal in Javascript, illegal in C#
Run Code Online (Sandbox Code Playgroud)


Cod*_*aos 7

他们唯一的共同点是它们用于声明局部变量.

JS的C#等价物vardynamic.但由于大多数C#用户更喜欢静态类型,因此通常仅用于某种​​类型的互操作场景(使用COM或动态类型语言).

C#var仍然使用静态类型,但使用推断类型.由于JS仅支持动态类型,因此没有等效的.

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