WEB开发网
开发学院软件开发C语言 C# 4动态编程新特性与DLR剖析 阅读

C# 4动态编程新特性与DLR剖析

 2010-09-30 22:46:36 来源:WEB开发网   
核心提示: 动态调用站点对象(本例中为<>p__Site1)有一个Target属性,它负责引用这一生成好的委托,C# 4动态编程新特性与DLR剖析(7),委托生成之后,动态表达式的执行就体现为委托的执行,则DLR生成的规则为:if(d1isint&&d2isint)//测试条件return(in

动态调用站点对象(本例中为<>p__Site1)有一个Target属性,它负责引用这一生成好的委托。

委托生成之后,动态表达式的执行就体现为委托的执行,其实参由C#编译器直接“写死”在IL代码中。

简化的代码示意如下(通过Reflector得到,为便于阅读,修改了变量名):

    object d = 100;
    object CS$0$0000 = d;
    if (<>p__Site1 == null)
        <>p__Site1 = CallSite<Func<CallSite, object, object>>.Create(……);
    d = <>p__Site1.Target(<>p__Site1, CS$0$0000);

上述类型推断、方法绑定及IL代码生成的工作都是在程序运行时完成的。

(4)动态代码很慢吗?

动态编程语言易学易用,代码紧凑,开发灵活,但性能则一直是它的“软肋”。为了提升性能,DLR设计了一个三级缓存策略。

动态站点绑定对象会为动态调用表达式转换而成的语法树加上相应的测试条件(称为“test”),构成一个“规则(Rule)”,这个规则可以用于判断某个语法树是否可用于特定的动态调用表达式。

举个例子,请看以下这个动态表达式:

d1 + d2

如果在程序运行时d1和d2都是int类型的整数,则DLR生成的规则为:

    if( d1 is int && d2 is int) //测试条件
        return (int)d1+(int)d2; //语法树

DLR通过检查规则中的“测试条件”,就可以知道某个动态表达式是否可以使用此规则所包容的语法树。

“规则”是DLR缓存的主要对象。

上一页  2 3 4 5 6 7 8 9 10  下一页

Tags:动态 编程 特性

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接