2013-08-01 122 views
2

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

+1

这里有一个很好的解释http://social.msdn.microsoft.com/Forums/vstudio/en-US/af2d0b6c-f1f3-4007-9f65-4418aa940c82/what-are-implicit-type-var-and-匿名类型 – christiandev

回答

7

有一个巨大的差别:

隐式类型(本地)变量,是哪种类型的未明确给出变量:

var i = new StringBuilder(); 

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

另一边匿名类型没有名字,他们是匿名

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

x是一个匿名类型的现在,随着一个只读属性Foo

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将产生一个匿名类型“{名称=‘A’;}”,并用它在你的代码替换变种。

+0

你确定你不能通过动态类型返回匿名类型吗? –

+0

您可以通过对象类型返回它,但我没有看到任何使用它的理由。 –

+0

但是,我没有看到太多的理由,但是,你在你的帖子中说它会抛出一个编译错误。 –

1

Implicitly Typed Local Variables (C# Programming Guide)

局部变量可以给出VAR代替 显式类型的推断“类型”。 var关键字指示编译器根据初始化语句右侧的表达式推断变量类型 。推断类型可以是内置类型,匿名类型,用户定义类型或.NET Framework类库中定义的类型。

另外:

了var关键字并不意味着 “变种”重要的是要理解,并不表明这个变量是弱类型,或 后期绑定。这只是表示编译器确定并指定 最合适的类型

有匿名类型和隐式类型变量之间的关系的关键:

在许多情况下使用VAR是可选的,仅仅是一个语法 便利。然而,当一个变量与一个匿名 类型初始化必须,如果你需要在稍后访问对象的 性声明的变量VAR。

0

有这些

匿名类型之间的一些根本的区别:

他们有效地类类型与任何其他然后只读属性。没有方法没有事件。它们不能在本地范围之外访问/声明。例如,如果在方法内部定义,则不能在该方法外访问它们。

隐式类型的

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

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语句中使用匿名。