您能解释使用声明的匿名类型吗?你能解释两种用法的利弊吗?
using(var myCtx = new Entity() )
{
}
另:
using(Entity myCtx = new Entity() )
{
}
它们之间有什么区别?
答案 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关键字只需根据作业的右侧“推断”作业左侧的类型。
优点:
缺点:
在某些情况下使用时会混淆代码(例如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)
这不是一个匿名类型,它只是一个语法快捷方式。就编译器而言,这两个语句是相同的。