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 = ;
} class DynamicClass
{
public dynamic DynValue = ;
} 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 确定使用什么引擎。脚本可以在自己的应用程序域或者在当前的应用程序域中创建。 不仅可以给脚本传入数值并从脚本中传出数值,还可以在脚本中调用在动态对象上创建的方法。
??????? 等待下次更新整理。
C# 动态语言扩展(11)的更多相关文章
- Azure Table storage 之改进DynamicTableEntity类为其添加动态语言扩展
在之前的一篇文章中提到,storage类库中包含一个可以用来动态获取Azure table storage 表结构的类-DynamicTableEntity. 我们可以通过这个类,我们无需为每一个表提 ...
- C#高级编程9-第12章 动态语言扩展
C#高级编程9-第12章 动态语言扩展 dynamic t = new ExpandoObject(); t.Abc = "abc"; t.Value = ; Console.Wr ...
- 【读书笔记】C#高级编程 第十二章 动态语言扩展
(一)DLR C#4的动态功能是Dynamic Language Runtime(动态语言运行时,DLR)的一部分.DLR是添加到CLR的一系列服务. (二)dynamic类型 dynamic类型允许 ...
- C语言扩展动态内存报错:realloc(): invalid next size: 0x0000000002365010 ***
晚上被这个内存扩展崩溃的问题折腾的有点崩溃,当答案揭晓的那一刻,恍然大悟,原来如此简单. 练习题目:输入一个字符串,根据字母进行排序,说白了就是一个简单的冒泡 #include <stdio.h ...
- Web服务器和动态语言如何交互--CGI&FastCGI&FPM浅谈
一个用户的Request是如何经过Web服务器(Apache,Nginx,IIS,Light)与后端的动态语言(如PHP等)进行交互并将结果返回给用户的呢? 本文浅谈个人观点,可能有误,欢迎拍砖,共同 ...
- C# 动态语言特性,dynamic 关键字研究
1 动态语言简介 支持动态特性的语言现在大行其道,并且有继续增长的趋势.比如 Ruby 和 Python, 还有天王级的巨星 --- JavaScript. 现在一个程序员说自己对 Jav ...
- 理解Javascript的动态语言特性
原文:理解Javascript的动态语言特性 理解Javascript的动态语言特性 Javascript是一种解释性语言,而并非编译性,它不能编译成二进制文件. 理解动态执行与闭包的概念 动态执行: ...
- javascript语言扩展:可迭代对象(3)
除了前2篇文章中描述的可迭代对象以外,在js语言扩展中的生成器对象,也可以作为可迭代对象. 这里用到一个新的关键字yield,该关键字在函数内部使用,用法和return类似,返回函数中的一个值:yie ...
- R语言扩展包dplyr——数据清洗和整理
R语言扩展包dplyr——数据清洗和整理 标签: 数据R语言数据清洗数据整理 2015-01-22 18:04 7357人阅读 评论(0) 收藏 举报 分类: R Programming(11) ...
随机推荐
- rabbitmq启动方式
1.以应用方式启动 rabbitmq-server -detached 后台启动 Rabbitmq-server 直接启动,如果你关闭窗口或者需要在改窗口使用其他命令时应用就会停止 关闭:rabbi ...
- 《你必须知道的495个C语言问题》读书笔记之第3章:表达式
1. C语言的设计目标之一就是高效的实现——让C语言的编译器相对较小,容易写成,同时也更容易生成较好的代码. 2. Q:下面的代码打印出49.不管按什么顺序,难道不该是56吗? ; printf(&q ...
- 【AtCoder】diverta 2019 Programming Contest
diverta 2019 Programming Contest 因为评测机的缘故--它unrated了.. A - Consecutive Integers #include <bits/st ...
- springboot通过slf4j配置日志
原因:SpringBoot默认使用slf4j日志,引入其他框架的时候,只需要把这个框架依赖的日志框架排除掉: 而我今天想引入log4j的时候,pom文件一直报错,显示找不到log4j的jar包,应当是 ...
- dfs/bfs专项训练
A.棋盘问题——poj1321 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放 ...
- Android试题
1. Binder:例子: https://blog.csdn.net/qq_33208587/article/details/82767720
- 第1章:Python语言与Linux系统管理
1.Python语言为什么流行 1).简单易学 2).丰富强大的库 3).开发效率高 2.Python语言有什么缺点 1).Python的执行速度不够快 2).Python的GIL锁限制并发:GIL是 ...
- 怎样理解在函数中声明var x = y = 1后调用函数时, x是局部变量, y是全局变量
下面这段代码在执行的时候, 打印的结果是1, Error: undefined; function fn() { var x = y = 1; } fn(); console.log(y); // 1 ...
- Springboot+mybatis+druid 配置多数据源
项目结构 application.yml配置文件 spring: application: name: service datasource: primary: jdbc-url: jdbc:orac ...
- elementUI中的loading
先安装引入 import ElementUI from 'element-ui' import { Loading } from 'element-ui' 在vue的原型链上定义一个打开loading ...