C# 动态语言扩展(11)

在 C# 4 开始添加 dynamic 类型。Mono C# 已经支持 C# 6.0 了。

DLR

C# 4 动态功能是 Dynamic Language Runtime (动态语言运行时,DLR)的一部分。DLR 是添加到CLR的 一系列服务,它允许添加动态语言,如 Ruby 和 Python,并是C# 具备和这些动态语言相同的某些动态功能。

IronRuby 和 IronPython 是 Ruby 和 Python 语言的开源版本,它们使用DLR。Silverlight 也可以使用 DLR。通过包含 DLR,可以给应用程序添加脚本编辑功能。脚本运行库允许给脚本传入变量和从脚本传去变量。

dynamic 类型

dynamic类型运行编写忽略编译期间的类型检查的代码。意思就是,运行之前不会检测该错误。

 public class Person
 {
     public string FirstName { get; set; }
     public string LastName { get; set; }

     public void GetFullName()
     {
         Console.WriteLine(FirstName + "   " + LastName);
     }
 }

dynamic dynamicPerson = new Person();
dynamicPerson.GetFullName("Zhao", "Lo");

运行时,会抛出 RuntimeBinderException 异常。

动态对象的类型可以任意改变。限制 不支持扩展方法,匿名函数(lambda 表达式)也不能用作动态方法调用的参数,因此LINQ不能用于动态对象。大多数LINQ调用都是扩展方法,而lambda表达式用作这些扩展方法的参数。

内部的动态操作

C# 是静态的类型化语言。那使用 dynamic 类型生成 IL (中间语言)。

class StaticClass
{
    public int IntValue = 100;
}

class DynamicClass
{
    public dynamic DynValue = 200;
}

class Program
{
    private static void Main(string[] args)
    {
        StaticClass staticClass = new StaticClass();
        DynamicClass dynamicClass = new DynamicClass();

        Console.WriteLine(staticClass.IntValue);
        Console.WriteLine(dynamicClass.DynValue);
        Console.ReadLine();
    }
}

然后用 Ildasm.exe 打开查看 IL 代码。

发现 C# 编译器做了许多工作,以支持动态类型。生成的代码中,会看到 System.Runtime.CompilerServices.CallSite 类 和 System.Runtime.CompilerServies.CallSiteBinder 类的引用。

CallSite 运行期间处理查找操作的类型。在运行期间调用动态对象时,必须找到该对象,看看其成员是否存在。CallSite会缓存这个信息。这样查找操作就不需要重复执行。

CallSite 完成了成员查找操作后,调用 CallSiteBinder() 方法。从 CallSite 提取信息,并生成表达式树,表示绑定器绑定的操作。

所以 dynamic 类型是非常有用,但是它有代价的。

包含 DLR ScriptRuntime

先从 codeplex 下载 http://dlr.codeplex.com/

假定能给应用程序添加脚本编辑功能,并给脚本传入数值和从脚本传出数值,使应用程序可以利用脚本完成工作。这些都在应用程序中包含 DLR 的 ScriptRuntime 提供的功能。目前 IronPython、InronRuby 和 JavaScript 都支持包含在应用程序中的脚本语言。

有了ScriptRuntime,就可以执行存储在文件中的代码段或完整的脚本。选择合适的语言引擎,或者让 DLR 确定使用什么引擎。脚本可以在自己的应用程序域或者在当前的应用程序域中创建。 不仅可以给脚本传入数值并从脚本中传出数值,还可以在脚本中调用在动态对象上创建的方法。

时间: 2024-10-15 12:47:00

C# 动态语言扩展(11)的相关文章

【读书笔记】C#高级编程 第十二章 动态语言扩展

(一)DLR C#4的动态功能是Dynamic Language Runtime(动态语言运行时,DLR)的一部分.DLR是添加到CLR的一系列服务. (二)dynamic类型 dynamic类型允许编写忽略编译期间的类型检查的代码.编译器假定,给dynamic类型的对象定义的任何操作都是有效的,在运行之前编译器不会检测是否存在错误. 例子: dynamic person = "人"; string firstName = person.FirstName; 这两行代码能够通过编译器编

C#学习笔记 ----动态语言扩展

C# 4的动态功能是Dynamic Language Runtime(动态语言运行时,DLR)的一部分 DLR是添加到CLR的一系列服务 dynamic类型允许编写忽略编译期间的类型检查的代码 有了ScriptRuntime,就可以执行存储在文件中的代码段或完整的脚本. 启动ScriptRuntime 需要执行4个特定的步骤:创建ScriptRuntime对象.设置合适的ScriptEngine和创建ScriptSource,以及创建ScriptScope. ScriptRuntime 对象是起

C语言扩展动态内存报错:realloc(): invalid next size: 0x0000000002365010 ***

晚上被这个内存扩展崩溃的问题折腾的有点崩溃,当答案揭晓的那一刻,恍然大悟,原来如此简单. 练习题目:输入一个字符串,根据字母进行排序,说白了就是一个简单的冒泡 #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h> #define BUF_LEN 100 #define COUNT 5 int main(void) { char buf[BUF_LEN];

PHP 动态语言以及搭建 blog 和 bbs 论坛

1.CGI 以及 FastCGI 介绍:1.CGI全称"通用网关接口"(Common Gateway Interface),用于HTTP服务器与其他服务器上的程序服务通信交流的一种工具,CGI程序须运行在网络服务器上.主要缺点:性能差.2.FastCGI是一个可伸缩地.高速地在HTTP服务器和动态脚本语言间通信的接口(FastCGI接口在linux下是socket)这个socket可以是文件socket,也可以是ip socket.主要优点:FastCGI接口方式采用C/S架构,把动态

理解Javascript的动态语言特性

原文:理解Javascript的动态语言特性 Javascript是一种解释性语言,而并非编译性,它不能编译成二进制文件. 理解动态执行与闭包的概念 动态执行:javascript提供eval()函数,用于动态解释一段文本,并在当前上下文环境中执行. 首先我们需要理解的是eval()方法它有全局闭包和当前函数的闭包,比如如下代码,大家认为会输出什么呢? var i = 100; function myFunc() { var i = 'test'; eval('i = "hello."

Web服务器和动态语言如何交互--CGI&amp;FastCGI&amp;FPM浅谈

一个用户的Request是如何经过Web服务器(Apache,Nginx,IIS,Light)与后端的动态语言(如PHP等)进行交互并将结果返回给用户的呢? 本文浅谈个人观点,可能有误,欢迎拍砖,共同学习. 一. 首先明确几个概念,以便后续说明 CGI:(Common Gateway Interface)Http服务器与后端程序(如PHP)进行交互的中间层. 工作原理及处理方式(fork-and-execute模式): 1.当Web Server有Request到达 2.fork一个CGI进程或

为什么说Python是一门动态语言--Python的魅力

动态语言的定义:动态编程语言是高级程序设计语言的一个类别,在计算机科学领域已被广泛应用.它是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化.动态语言目前非常具有活力.众所周知的ECMAScript(JavaScript)便是一个动态语言,除此之外如PHP.Ruby.Python等也都属于动态语言,而C.C++等语言则不属于动态语言.----来自维基百科 你是不是有过给class里面变量赋值却发现程序没达到自己预期结果的遭遇?是不

动态语言的灵活性是把双刃剑 -- 以Python语言为例

本文有些零碎,总题来说,包括两个问题:(1)可变对象(最常见的是list dict)被意外修改的问题,(2)对参数(parameter)的检查问题.这两个问题,本质都是因为动态语言(动态类型语言)的特性造成了,动态语言的好处就不细说了,本文是要讨论因为动态--这种灵活性带来的一些问题. 什么是动态语言(Dynamic Programming language)呢,是相对于静态语言而言,将很多静态语言编译(compilation)时期所做的事情推迟到运行时,在运行时修改代码的行为,比如添加新的对象

C# 动态语言特性,dynamic 关键字研究

原文:C# 动态语言特性,dynamic 关键字研究 1       动态语言简介 支持动态特性的语言现在大行其道,并且有继续增长的趋势.比如 Ruby 和 Python, 还有天王级的巨星 --- JavaScript. 现在一个程序员说自己对 JavaScript 根本没使用过,别人一定把你当成从火星回来的吧! 很多使用过 JavaScript 的程序员,刚开始对其动态特性深恶痛绝,欲除之而后快,但是一旦熟悉这个语言以后,又会发疯般的爱上她(我的野蛮女友). 以创建一个“人”为例, Java