我想提出一个理论上的问题。例如,如果我在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
关键字。这种结构的好处是什么? 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-to-Sql或Entity Framework中的匿名类型投影是第二个例子的一个很好的例子:
var results = context.People.Where(p => p.Name == "Adam")
.Select(p => new { p.Name, p.Address });
此处
results
的类型为IQueryable<SomeTypeTheCompilerCreatedOnTheFly>
。无论您想写出实际的结果类型多少,而不仅仅是编写var
,都无法做到,因为您不知道编译器在匿名类型的幕后创建的类型,因此使用了术语:此类型为匿名在这两种情况下,类型都是在编译时知道的,在两种情况下,随后都说
conn = new DateTime();
或者
results = new DateTime();
会导致编译器错误,因为您将
conn
和results
设置为与声明为的类型不兼容的类型。