答案 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)
ReallyLongTypeName<SomeOtherLongTypeName> MyVariable = new ReallyLongTypeName<SomeOtherLongTypeName>();
答案 4 :(得分:1)
以下是一些优点
无耻的自我推销。我曾经写过一篇关于这个主题的博客文章,当我认为var的使用是恰当的并且包含该主题的相关信息时。
答案 5 :(得分:0)
简而言之:
答案 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>