C# 3.0 中 var 关键字的优势 [重复]

Posted

技术标签:

【中文标题】C# 3.0 中 var 关键字的优势 [重复]【英文标题】:Advantage of var keyword in C# 3.0 [duplicate] 【发布时间】:2010-10-27 10:33:58 【问题描述】:

复制:

What to use var or object name type

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

【问题讨论】:

I couldn't understand the need of var keyword in C# 3.0.所以你不懂anonymous types和LINQ 【参考方案1】:

它主要用于 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;

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

【讨论】:

当 Visual Studio 的类型安全性和编译器为您跟踪所有这些时,为什么不像使用松散类型系统一样使用它。它可以使将来的重构变得更加容易。我也知道有些时候,比如你的“var nonObviousType = 999999999;”例如,当您可能应该声明类型以帮助编译器时。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

这是声明 var 的简写方式。尽管 "int i = new int()" 键入起来并不多,但当你开始输入更长的类型时,你最终会得到很多看起来像这样的行:

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

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

【讨论】:

【参考方案4】:

这里有几个优点

    打字少,功能不丢失 提高代码的类型安全性。使用类型为 var 的迭代变量的 foreach 循环将静默捕获以显式类型引入的强制类型转换 这样您就不必在变量声明中写两次相同的名称。 某些功能,例如声明强类型匿名类型局部变量,需要使用 var

无耻的自我推销。不久前我写了一篇关于这个主题的博客文章,当我认为 var 的使用是合适的并且包含与这个主题相关的信息时,它深入探讨了。

http://beta.blogs.msdn.com/jaredpar/archive/2008/09/09/when-to-use-type-inference.aspx

【讨论】:

【参考方案5】: Linq 表达式不返回预定义类型,因此您需要一个“通用”变量声明关键字来捕获该类型以及使用匿名类型的其他地方。 谨慎使用,它可以通过将方法的返回类型与捕获它的变量解耦来简化重构。 对于同一个语句,必须将相同的名称放在同一行两次,这确实有点愚蠢。输入这样的内容很痛苦:

.

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

【讨论】:

我通常希望你可以这样做:ReallyLongTypeName myVariable = new (); @BFree:我认为 VS 有效地做到了这一点。【参考方案6】:

简而言之:

    尽量减少两次键入变量类型的需要 在支持匿名类型时必不可少,例如由 LINQ 查询返回

【讨论】:

【参考方案7】:

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&lt;Dictionary&lt;List&lt;string&gt;,IOrderedCollection&lt;DateTime&gt;&gt; myBadDesign = getBadDesignController().BadDesignResults("shoppingCart"); 这样的内容 如果你是一个懒惰的打字员,这只是一个副作用/奖励 =)

如果您开始在不同的位置调用 var,但如果您将 var 用于强类型并且编译器可以确定您的变量的类型,那么任何阅读器都应该能够确定它。

/p>

【讨论】:

以上是关于C# 3.0 中 var 关键字的优势 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

C#中的var理解

C#中的“var”是啥意思? [复制]

C# var声明变量解析

C# 3.0 LINQ的准备工作

为啥 C# 3.0 对象初始值设定项构造函数括号是可选的?

C#中“var”和“object”之间的区别[重复]