Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#3.0中var关键字的优势_C#_Variables - Fatal编程技术网

C#3.0中var关键字的优势

C#3.0中var关键字的优势,c#,variables,C#,Variables,重复: 我不明白C#3.0中需要var关键字,使用它有什么好处。 我看到了这个问题,但不明白使用它的真正目的 Linq表达式不返回预定义的类型,因此需要一个“泛型”变量声明关键字来捕获该类型以及使用匿名类型的其他位置 如果仔细使用,它可以通过将方法的返回类型与捕获它的变量解耦来简化重构 为了同一句话,必须在同一行上写两次相同的名字,这真的有点傻。键入这样的内容很痛苦: ReallyLongTypeName MyVariable=new ReallyLongTypeName(); 它存在的主

重复:

我不明白C#3.0中需要var关键字,使用它有什么好处。 我看到了这个问题,但不明白使用它的真正目的
  • Linq表达式不返回预定义的类型,因此需要一个“泛型”变量声明关键字来捕获该类型以及使用匿名类型的其他位置
  • 如果仔细使用,它可以通过将方法的返回类型与捕获它的变量解耦来简化重构
  • 为了同一句话,必须在同一行上写两次相同的名字,这真的有点傻。键入这样的内容很痛苦:
  • ReallyLongTypeName MyVariable=new ReallyLongTypeName();
    
    它存在的主要原因是在C#中引入了匿名类型。您可以动态构造没有名称的类型。您将如何指定他们的名称?答案是:你不能。您只需告诉编译器为您推断它们:

    var user = users.Where(u=> u.Name == "Mehrdad")
                    .Select(u => new { u.Name, u.Password });
    

    它主要用于LINQ,您可以使用匿名类型作为投影:

    var query = from person in employees
                where person.Salary > 10000m
                select new { FullName=person.Name, person.Department };
    
    这里不能显式声明
    查询的类型,因为匿名类型没有名称。(在现实世界中,匿名类型通常包含来自多个对象的值,因此没有一个命名类包含所有属性。)

    当您使用可能很长的类型名(通常是泛型)初始化变量并仅调用构造函数时,它实际上也很有用-它增加了信息密度(减少了冗余)。这两行中的信息量相同:

    List<Func<string, int>> functions = new List<Func<string, int>>();
    var functions = new List<Function<string, int>>();
    

    但是当很明显类型的变量是什么时,我相信它可以显著提高可读性。

    这是一种声明变量的简捷方法。虽然“int I=new int()”不太适合键入,但当您开始使用较长的类型时,您会得到很多类似以下的行:

    SomeReallyLong.TypeName.WithNameSpaces.AndEverything myVar = new SomeReallyLong.TypeName.WithNameSpaces.AndEverything();
    

    最终有人想到,由于您用来初始化var的信息,编译器已经知道您要声明的类型,因此要求编译器在这里做正确的事情并不过分。

    这里有几个优点

  • 输入更少,不会丢失功能
  • 提高代码的类型安全性。使用类型化为var的迭代变量的foreach循环将以静默方式捕获显式类型引入的强制转换
  • 这样,您就不必在变量声明中两次写入相同的名称
  • 有些特性,例如声明强类型匿名类型局部变量,需要使用var
  • 无耻的自我推销。不久前,我写了一篇关于这个主题的博客,谈到了我认为使用var是合适的,并且包含了与这个主题相关的信息

    简而言之:

  • 尽可能减少两次键入变量类型的需要
  • 在支持匿名类型(如LINQ查询返回的类型)方面至关重要

  • var关键字的真正需求是支持C#3.0中的匿名类型,而这反过来又需要正确支持LiNQ(语言集成查询)

    如果不使用var,您永远无法执行以下操作:

     var person = new { Name = "Peter", Age=4};
    
    这意味着您无法执行以下linq查询,因为您不知道如何将其分配给变量:

    [var/sometype] dogsFixedQuery = from myDog in kennel select new {dogName = myDog.FirstName + " " + myDog.OwnerLastName, myDog.IsNeutered, dogLocation = kennel.Address};
    
    如果您开始创建具有多级返回和联接的更复杂的linq查询,那么匿名类型的效用将更加明显


    事实上,您可以通过其他方式使用var来避免键入类似
    IEnumerable的内容。我通常希望您可以这样做:ReallyLongTypeName myVariable=new()@我认为VS有效地做到了这一点。当visual studio的类型安全性和编译器为您跟踪所有这些时,为什么不像使用松散类型系统那样使用它呢。它可以使将来的重构变得更加容易。此外,我知道有些时候,例如“var nonObviousType=99999999;”示例,您可能需要声明类型来帮助编译器。
    我无法理解C#3.0
    中var关键字的需要。因此,您不理解
     var person = new { Name = "Peter", Age=4};
    
    [var/sometype] dogsFixedQuery = from myDog in kennel select new {dogName = myDog.FirstName + " " + myDog.OwnerLastName, myDog.IsNeutered, dogLocation = kennel.Address};