你能解释一下使用声明的匿名类型吗?

时间:2011-04-02 10:09:54

标签: c# .net c#-4.0

您能解释使用声明的匿名类型吗?你能解释两种用法的利弊吗?

using(var myCtx = new Entity() )
{

}

另:

using(Entity myCtx = new Entity() )
{

}

它们之间有什么区别?

4 个答案:

答案 0 :(得分:5)

这是一个隐式类型变量,而不是匿名类型。 (使用new { X = 10, Y = "hello" }等表达式可以获得匿名类型。

你的两个代码片段完全等效 - 编译器只是推断myCtx的类型:它仍然是静态类型的;该对象仍将被处置等。

此处using语句没有特定内容 - 您可以对任何局部变量使用隐式类型,只要您想要的类型与初始化表达式的编译时类型相同即可。 (如果值为null或匿名函数,则需要转换该值,此时使用var是合理的无意义。说实话。)

Blatant plug:你可以在我的书第8章C#in Depth中找到隐式输入匿名类型的更多细节。幸运的是,这是您可以从Manning page for the book下载的免费章节之一。

答案 1 :(得分:2)

这实际上不是匿名类型使用...它是推断类型用法。使用var关键字只需根据作业的右侧“推断”作业左侧的类型。

优点:

  • 消除冗余(例如,MyType a = new MyType()是高度冗余且不必要的)

缺点:

  • 在某些情况下使用时会混淆代码(例如var a = GetSomething(); ---什么类型?我不知道如何不查看GetSomething()的返回类型

  • 使用var时你失去了多态性的能力(你不能拥有MyParentType a = new MySubType()) - 这实际上并不是一个骗局,而是var关键字的无效用例。

我的经验法则是我喜欢var关键字,但只在意图已经明确的地方使用它...也就是说,我在使用new关键字时使用它,但不能用于foreach循环或基于返回方法的值。

答案 2 :(得分:2)

两种陈述产生的IL之间没有区别,它们在功能上是相同的。你在这里做的是让编译器推断myCtx的类型,而不是创建一个非同类型。它可以使代码更加清晰,例如:

var items = new Dictionary<int, Dictionary<int, string>>();

更清晰,并且不会隐藏代码的任何意图,而不是:

Dictionary<int, Dictionary<int, string>> items = 
    new Dictionary<int, Dictionary<int, string>>();

答案 3 :(得分:2)

这不是一个匿名类型,它只是一个语法快捷方式。就编译器而言,这两个语句是相同的。