C# Javascript和C中var实现的差异#

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

我想问一个理论问题。例如,如果我在页面加载中有以下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
    关键字。这种构造的好处是什么
  • 在Javascript和C中实现
    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
    设置为与声明为的类型不兼容的类型

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

    JS
    var
    的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);
    }