C#3.0中var关键字的优点

时间:2009-05-19 19:20:26

标签: c# variables

重复:

  

What to use var or object name type

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

7 个答案:

答案 0 :(得分:23)

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

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

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

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

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

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

当然可以被滥用,例如

var nonObviousType = 999999999;

但是当类型的变量显而易见时,我相信它可以显着提高可读性。

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

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

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

最终有人发现编译器已经知道你用什么类型声明了感谢你用来初始化var的信息,所以要求让编译器在这里做正确的事并不会太多

答案 3 :(得分:1)

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

ReallyLongTypeName<SomeOtherLongTypeName> MyVariable = new ReallyLongTypeName<SomeOtherLongTypeName>();

答案 4 :(得分:1)

以下是一些优点

  1. 减少输入而不会丢失功能
  2. 提高代码的类型安全性。使用类型为var的迭代变量的foreach循环将捕获使用显式类型引入的静默强制转换
  3. 使其不必在变量声明中两次写入相同的名称。
  4. 某些功能(例如声明强类型匿名类型的局部变量)需要使用var
  5. 无耻的自我推销。我曾经写过一篇关于这个主题的博客文章,当我认为var的使用是恰当的并且包含该主题的相关信息时。

答案 5 :(得分:0)

简而言之:

  1. 最小化两次输入变量类型的需要
  2. 对支持匿名类型至关重要,例如由LINQ查询返回

答案 6 :(得分:0)

对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<Dictionary<List<string>,IOrderedCollection<DateTime>> myBadDesign = getBadDesignController().BadDesignResults("shoppingCart");之类的内容 只是一个副作用/奖金,如果你是一个懒惰的typer =)

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