隐式键入与匿名类型

时间:2013-08-01 10:47:33

标签: c# .net anonymous-types implicit

Implicitly Typed和Anonymous Type之间是否相同或有任何区别。如果它不同那么Implicitly Typed和Anonymous Type之间的主要区别是什么?

5 个答案:

答案 0 :(得分:7)

存在巨大差异:

隐式类型(局部)变量,是未明确给出类型的变量:

var i = new StringBuilder();

现在,i隐式为StringBuilder类型 - 一种命名类型。

另一方的匿名类型没有名称,它们是匿名

var x = new { Foo = "Bar" };

x现在是匿名类型,具有只读属性Foo

答案 1 :(得分:2)

匿名类型只能在声明它的范围内使用。因此,您可以将其用于本地任务,并且不能在外部范围内使用它。

引入了匿名类型以与linq一起使用以实现简单的分组和转换。 主要目标是避免在单个范围中使用的显式类型声明。

List<TypeOne> firstList;
List<TypeTwo> secondList;

var joined = firstList
    .GroupJoin(secondlist, i => i.KeyOfTypeOne, i => i.KeyOfTypeTwo, (first, second) => new { First = first, Second = second});

因此声明了一个新的匿名类型,您可以在同一个上下文中使用它但不能作为强类型对象发送到当前作用域的边界

TypeName Method() // you can't specify a type here except object or dynamic
{
   ...
   return joined;
}

但你可以在没有任何限制的情况下在本地使用它

return joined.Where(i => i.Second.Any()).Select(i => i.First);

另一方面,隐式类型变量用于允许您使用匿名类型的对象。 Compilator将调查您的代码并使用实际类型而不是var关键字。

var inst = new {Name = "a";}

compilator会生成一个匿名类型“{Name =”a“;}”并用它代替代码中的var。

答案 2 :(得分:2)

它们之间存在一些差异

  

隐式输入

我们可以知道哪种类型的数据类型或类分配给 var

e.g.

var i = 10; /*here int datatype assigned*/
var A = new ArrayList(); /*here arraylist() class assigned*/

我们也可以隐式输入另一个范围。

  

匿名类型

当我们不确定分配给 var

的班级类型时
e.g.
var a = new { Age = 12 , Name = X };

匿名变量仅在声明它的范围内使用。但是不能在另一个范围内使用而且不能在return语句中写入。

一般匿名在Linq声明中使用。

答案 3 :(得分:1)

来自Implicitly Typed Local Variables (C# Programming Guide)

  

可以给局部变量一个var的推断“类型”而不是一个   显式类型。 var关键字指示编译器推断出   来自右侧的表达式的变量类型   初始化声明。推断类型可以是内置类型,a   匿名类型,用户定义的类型或.NET中定义的类型   框架类库。

此外:

  

重要的是要理解var关键字并不意味着   “variant”并不表示变量是松散类型的,或者   后期绑定。 这只是意味着编译器确定并分配了   最合适的类型

匿名类型和隐式类型变量之间存在关键关系:

  

在许多情况下,var的使用是可选的,只是一种语法   方便。但是,当使用匿名初始化变量时   键入如果需要访问,则必须将变量声明为为var   稍后的对象的属性。

答案 4 :(得分:0)

这些

之间几乎没有根本区别
  

匿名类型:

它们实际上是类类型,只有只读属性。没有方法没有事件。它们不能在本地范围之外访问/声明。例如,如果在方法中定义,则无法在该方法之外访问它们。

  

隐式输入

我们可以使用var作为隐式类型。这实际上意味着表达式右侧的任何类型都将由编译器分配给此var。这些不能为空。