C# 你能解释一下using语句中的匿名类型吗?

C# 你能解释一下using语句中的匿名类型吗?,c#,.net,c#-4.0,C#,.net,C# 4.0,你能解释一下using语句中的匿名类型吗?你能解释一下这两种用法的利弊吗 using(var myCtx = new Entity() ) { } 另一个: using(Entity myCtx = new Entity() ) { } 它们之间有什么区别?这实际上不是匿名类型用法……而是推断的类型用法。使用var关键字只是基于赋值的右侧“推断”赋值左侧的类型 优点: 消除冗余(例如MyType a=new MyType()是高度冗余且不必要的) 缺点: 在某些场景中使用时会混淆代

你能解释一下using语句中的匿名类型吗?你能解释一下这两种用法的利弊吗

using(var myCtx = new Entity() )
{

}
另一个:

using(Entity myCtx = new Entity() )
{

}

它们之间有什么区别?

这实际上不是匿名类型用法……而是推断的类型用法。使用var关键字只是基于赋值的右侧“推断”赋值左侧的类型

优点:

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

  • 在某些场景中使用时会混淆代码(例如,var a=GetSomething();---什么类型是a?如果不查看GetSomething()的返回类型,我就不知道了)

  • 使用var时,您将失去多态性功能(您不能使用MyParentType a=new MySubType())-这不是一个真正的缺点,甚至对于var关键字来说是一个无效的用例


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

为这两个语句生成的IL没有区别,它们在功能上是相同的。这里要做的是让编译器推断出
myCtx
的类型,而不是创建一个异常类型。它可以使代码更加清晰,例如:

var items = new Dictionary<int, Dictionary<int, string>>();
var items=newdictionary();
比以下内容更清晰,并且不会隐藏代码的任何意图:

Dictionary<int, Dictionary<int, string>> items = 
    new Dictionary<int, Dictionary<int, string>>();
字典项=
新字典();

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

这是一个隐式类型的变量,而不是匿名类型。(匿名类型是使用诸如
new{X=10,Y=“hello”}
之类的表达式得到的

您的两个代码片段完全相同-编译器只是在推断
myCtx
的类型:它仍然是静态类型;对象仍将被释放,等等

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

公然插入:你可以在我的书《深入C#》的第8章中找到隐式类型和匿名类型的更多细节。幸运的是,这是你可以从下载的免费章节之一。

在这两个示例中,myCtx都不是匿名的。可能是