C#3.0中var关键字的优点

重复:

什么用var或对象名称类型

我无法理解C#3.0中var关键字的必要性使用它有什么好处。 我看到了这个问题但却不明白使用它的真正目的

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

 var query = from person in employees where person.Salary > 10000m select new { FullName=person.Name, person.Department }; 

这里不能显式声明query类型,因为匿名类型没有名称。 (在实际情况下,匿名类型通常包含来自多个对象的值,因此没有一个命名类包含所有属性。)

当您使用可能很长的类型名称(通常由于generics)初始化变量并且仅调用构造函数时,它非常有用 – 它会增加信息密度(减少冗余)。 这两行中的信息量相同:

 List> functions = new List>(); var functions = new List>(); 

但第二个以更紧凑的方式表达它。

当然,这可能会被滥用,例如

 var nonObviousType = 999999999; 

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

它存在的主要原因是在C#中引入了匿名类型。 您可以动态构造没有名称的类型。 你会如何指定他们的名字? 答案:你做不到。 您只需告诉编译器为您推断它们:

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

这是声明var的简写方式。 虽然“int i = new int()”的输入并不算太多,但是当你开始使用更长的类型时,你会得到很多看起来像这样的行:

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

由于你用来初始化var的信息,编译器已经知道你发布了什么类型,最终发生了这种情况,因此要求让编译器在这里做正确的事情并不会太多。

这有几个优点

  1. 减少打字而不丢失function
  2. 增加代码的类型安全性。 使用类型为var的迭代变量的foreach循环将捕获使用显式类型引入的静默强制转换
  3. 这使得您不必在变量声明中两次写入相同的名称。
  4. 某些function(例如声明强类型匿名类型的局部变量)需要使用var

无耻的自我推销。 我曾经写过一篇关于这个主题的博客文章,当我认为var的使用是恰当的并且包含该主题的相关信息时。

  • Linq表达式不返回预定义类型,因此您需要一个“通用”变量声明关键字来捕获使用匿名类型的地方和其他地方。
  • 仔细使用,它可以通过将方法的返回类型与捕获它的变量分离来使重构更容易。
  • 必须为同一个语句在同一行上放两次相同的名称真的很傻。 输入这样的内容会很痛苦:

 ReallyLongTypeName MyVariable = new ReallyLongTypeName(); 

简而言之:

  1. 最小化两次输入变量类型的需要
  2. 支持匿名类型的必要条件,例如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,IOrderedCollection> myBadDesign = getBadDesignController().BadDesignResults("shoppingCart"); 只是一个副作用/奖金,如果你是一个懒惰的typer =)

如果您开始在不同的位置调用变量,但是如果您使用var作为强类型,并且编译器可以确定变量的类型,那么可读性也是可读性的,而且任何读者都应该能够确定变量的类型。