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)
问题:
var关键字.这种结构有什么好处?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)
将导致编译器错误,因为你设置conn和results的类型,这不是跟他们有什么兼容的声明.
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)