我想提出一个理论上的问题。例如,如果我在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关键字。这种结构的好处是什么?
  • 用Java和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-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();
    

    会导致编译器错误,因为您将connresults设置为与声明为的类型不兼容的类型。

    10-06 00:06
    查看更多