1.C#3.0开始引入了隐式类型变量var和匿名类型,如下:
var v = new { Amount = 1, Message = "he" };
Response.Write("111111111111111111<BR>2" + v);
实际上v这个变量, 编译以后, .net自动生成了一个f_AnonymousType0的类.
[CompilerGenerated, DebuggerDisplay(@"\{ Amount = {Amount}, Message = {Message} }", Type="<Anonymous Type>")] internal sealed class <>f__AnonymousType0<<Amount>j__TPar, <Message>j__TPar> { // Fields [DebuggerBrowsable(DebuggerBrowsableState.Never)] private readonly <Amount>j__TPar <Amount>i__Field; [DebuggerBrowsable(DebuggerBrowsableState.Never)] private readonly <Message>j__TPar <Message>i__Field; // Methods [DebuggerHidden] public <>f__AnonymousType0(<Amount>j__TPar Amount, <Message>j__TPar Message); [DebuggerHidden] public override bool Equals(object value); [DebuggerHidden] public override int GetHashCode(); [DebuggerHidden] public override string ToString(); // Properties public <Amount>j__TPar Amount { get; } public <Message>j__TPar Message { get; } }
|
隐式类型变量var v和匿名类型主要用于LINQ.
2.dynamic
dynamic是.net 4.0引入的,var和dynamic完全是两个概念,不是一码事。var实际上是编译期抛给我们的“语法糖”,一旦被编译,编译期会自动匹配var 变量的实际类型,并用实际类型来替换该变量的申明,这看上去就好像我们在编码的时候是用实际类型进行申明的。而dynamic被编译后,实际是一个object类型,只不过编译器会对dynamic类型进行特殊处理,让它在编译期间不进行任何的类型检查,而是将类型检查放到了运行期。
具体参见:改善C#程序的建议2:C#中dynamic的正确用法 http://www.cnblogs.com/luminji/archive/2011/02/18/1957484.html
var主要用于LINQ, 那dynamic呢? 可以简化反射。