var 隐式类型变量和匿名类型 vs dynamic 动态类型。

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呢? 可以简化反射。

 

posted on 2011-08-08 10:31  BobLiu  阅读(1305)  评论(0编辑  收藏  举报