2

隐式类型和匿名类型之间是否相同或有任何区别。如果不同,那么隐式类型和匿名类型之间的主要区别是什么?

4

5 回答 5

8

这是个很大的差异:

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

var i = new StringBuilder();

现在,i是隐式类型StringBuilder- 命名类型。

另一边的匿名类型没有名字,它们是匿名的:

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

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

于 2013-08-01T10:49:34.073 回答
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);

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

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

编译器将生成一个匿名类型 "{Name = "a";}" 并使用它来替换代码中的 var。

于 2013-08-01T10:50:39.307 回答
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 };

匿名变量仅在声明它的范围内使用。但不能在另一个范围内使用,也不能写在方法的返回语句中。

通常在 Linq 语句中使用匿名。

于 2013-08-02T05:14:17.823 回答
1

来自隐式类型的局部变量(C# 编程指南)

局部变量可以被赋予 var 的推断“类型”而不是显式类型。var 关键字指示编译器从初始化语句右侧的表达式推断变量的类型。推断的类型可能是内置类型、匿名类型、用户定义类型或 .NET Framework 类库中定义的类型。

还:

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

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

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

于 2013-08-01T10:50:55.367 回答
0

这些之间几乎没有根本区别

匿名类型:

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

隐式键入

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

于 2013-08-01T11:03:35.693 回答