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) ...
随机推荐
- 洛谷 题解 P1352 【没有上司的舞会】
树形DP的一道较为基础的模板题 状态 dp[i][0/1]为第i个员工是否来参加的最大值 转移 先找到根节点 先遍历完它的儿子,再来更新答案 dp[i][0]+=max(dp[j][0],dp[j][ ...
- RestTemplate实践(及遇到的问题)
在微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端.我们可以使用JDK原生的URLConnection.Apache的Http Client.Netty的异步 ...
- TemplateView , ListView ,DetailView三种常用类视图用法
参考博客: https://blog.csdn.net/weixin_36571185/article/details/74280102
- Oracle存储过程——日常记录
代码规范 Oracle存储过程,关键字大写,变量小写并以v_开头,规范代码,提高可读性 赋值与判断符号 Oracle存储过程,变量赋值使用 := 符号,条件判断直接用 = 符号. 变量声明需在 beg ...
- Spring实例化Bean三种方法:构造器、静态工厂、实例工厂
Spring中Bean相当于java中的类,可以通过xml文件对bean进行配置和管理. 一.Bean的实例化: 构造器实例化.静态工厂实例化.实例工厂方式实例化. 目录: 构造器实例化: xml配置 ...
- 盒模型中padding、border、margin的区别
在CSS中,规定了一种基本设计模型——盒模型(也叫框模型),如图所示: 其中包含了四部分内容:element/元素(即图中文字).padding/内边框(图中两个红色边框之间白色部分).border/ ...
- P1040 加分二叉树(区间DP)
(点击此处查看原题) 解题思路 题目已经给出了树的中序遍历,因此我的想法是利用中序遍历的特点:若某子树的根结点为k,那么k之前的结点组成这一子树的左子树,k之后的结点组成这一子树的右子树,可以通过不断 ...
- PHP学习之PHP的语法糖
PHP的语法糖 计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用. 常见的PHP的语法糖 echo(),print(),die(),isset(),unset(),i ...
- golang之工厂模式
说明: golang的结构体没有构造函数,通常可以使用工厂模式来解决这个问题 如果包里面的结构体变量首字母小写,引入后,不能直接使用,可以工厂模式解决: ch1.go package ch1 type ...
- k8s之RBAC-基于角色的访问控制
一个在名称空间内的对象的完整url模板: Object_URL: /apis/<GROUP>/<VERSION>/namespaces/<NAMESPACE_NAME&g ...