隐式类型和匿名类型之间是否相同或有任何区别。如果不同,那么隐式类型和匿名类型之间的主要区别是什么?
5 回答
这是个很大的差异:
隐式类型(局部)变量是未明确给出类型的变量:
var i = new StringBuilder();
现在,i
是隐式类型StringBuilder
- 命名类型。
另一边的匿名类型没有名字,它们是匿名的:
var x = new { Foo = "Bar" };
x 现在是匿名类型,具有只读属性Foo
。
匿名类型只能在声明它的范围内使用。所以你可以将它用于本地任务,而不能在外部范围内使用它。
引入匿名类型以与 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。
它们之间有一些区别
隐式类型
我们可以知道分配给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 语句中使用匿名。
局部变量可以被赋予 var 的推断“类型”而不是显式类型。var 关键字指示编译器从初始化语句右侧的表达式推断变量的类型。推断的类型可能是内置类型、匿名类型、用户定义类型或 .NET Framework 类库中定义的类型。
还:
重要的是要理解 var 关键字并不意味着“变体”,也不表示该变量是松散类型或后期绑定的。它只是意味着编译器确定并分配最合适的类型。
匿名类型和隐式类型变量之间存在关键关系:
在许多情况下,使用 var 是可选的,只是为了语法方便。但是,当使用匿名类型初始化变量时,如果以后需要访问对象的属性,则必须将该变量声明为 var。
这些之间几乎没有根本区别
匿名类型:
它们实际上是类类型,除了只读属性之外别无其他。没有方法没有事件。它们不能在本地范围之外访问/声明。例如,如果在方法内部定义,则无法在该方法外部访问它们。
隐式键入
我们可以var
用作隐式类型。这实际上意味着表达式右侧的任何类型都将由编译器分配给此 var。这些不能为空。