【发布时间】:2013-08-02 05:58:54
【问题描述】:
隐式类型和匿名类型之间是否相同或有什么不同。如果不同,那么隐式类型和匿名类型之间的主要区别是什么?
【问题讨论】:
标签: c# .net anonymous-types implicit
隐式类型和匿名类型之间是否相同或有什么不同。如果不同,那么隐式类型和匿名类型之间的主要区别是什么?
【问题讨论】:
标签: c# .net anonymous-types implicit
有很大的不同:
隐式类型(局部)变量,是没有明确给出类型的变量:
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 语句中通常使用匿名。
【讨论】:
来自Implicitly Typed Local Variables (C# Programming Guide):
可以给局部变量一个推断的“类型” var 而不是 显式类型。 var 关键字指示编译器推断 右侧表达式中的变量类型 初始化语句。推断的类型可能是内置类型, 匿名类型、用户定义的类型或在 .NET 中定义的类型 框架类库。
还有:
重要的是要理解 var 关键字并不意味着 “variant”,并不表示变量是松散类型的,或者 迟到。 这只是意味着编译器确定并分配 最合适的类型。
匿名类型和隐式类型变量之间存在关键关系:
在许多情况下,使用 var 是可选的,只是一种语法 方便。但是,当使用匿名变量初始化变量时 如果您需要访问 对象的属性在稍后的时间点。
【讨论】:
它们之间几乎没有根本区别
匿名类型:
它们实际上是类类型,除了只读属性之外别无其他。没有方法没有事件。它们不能在本地范围之外访问/声明。例如,如果在方法内部定义,则无法在该方法外部访问它们。
隐式输入
我们可以使用var 作为隐式类型。这实际上意味着表达式右侧的任何类型都将由编译器分配给此 var。这些不能为空。
【讨论】: