NET4.0新特性动态语言
2011-06-09 16:44
302 查看
dynamic元类型
C# 4.0将通过新的元类型"dynamic"来添加对后期绑定的支持。任何直接声明为这种类型的变量,或者从函数中返回这种类型的值,都将自动地视为后期绑定。这类似于在Visual Basic中把变量声明为"object",不过它现在可以支持任何类型系统了,不仅仅是CTS(通用类型规范)和COM。
一个重要之处是,这个特性的目标就是为了支持后期绑定,以及更多地为了支持近来流行的动态绑定。动态类型明显不是C#的一个特性,不过是为了支持动态绑定的一个后果。
还要着重注意的一点是,反射并不是一种很好的替代方案。使用反射的问题在于,需要处理各种各样的类型。使用Reflection命名空间调用方法的方式和在ScriptObject上调用方法的方式并不相同。尤其,Ruby/Python方法这样的第三方方法。
dynamic ExpandoObject
熟悉js的朋友都知道js可以这么写 :
var t = new Object();
t.Abc = "something";
t.Value = 243;
现在这个js动态语言的特性,我们也可以在c#中使用了,前提是将一个变量声明为ExpandoObject类型。如下例:
static void Main(string[] args)
{
dynamic t = new ExpandoObject();
t.Abc = "abc";
t.Value = 10000;
Console.WriteLine("t's abc = {0},t's value = {1}", t.Abc, t.Value);
Console.ReadLine();
}
C# 4.0中新增了一个命名空间System.Dynamic来实现对此应用的支持,这种用法的意义何在,现在我还不太清楚,也是是c#向动态语言过渡的一种试探吧。以下展示的是dynamic可变类型特性
dynamic d = 1;
Console.WriteLine(d.ToString());
d = new DateTime();
Console.WriteLine(d.ToString());
d = "szl";
Console.WriteLine(d.ToString());
dymanic应用场景
按New features in CSharp 4的说法,dymanic主要应用于下面的场景:
1、自动反射
2、COM组件互操作
3、混合编程,例如IronRuby和IronPython
4、处理Html DOM对象
如果有处理过上面这些工作的朋友们,应该不难理解了吧。
有了dynamic的支持让我们看下更强大的功能吧:
反射调用
Type type = Type.GetType("ConsoleApplication1.Test");
dynamic t = Activator.CreateInstance(type);
t.Print("你好,szl,欢迎使用 CSharp 4.0!");
这里我们之间调用了ConsoleApplication1.Test类型中的Print方法,就行创建实例后调用一样,是不是很方便。
P/Invoke 调用
dynamic user32 = new DynamicDllImport("user32.dll",
callingConvention: CallingConvention.Winapi);
user32.MessageBox(0, "Hello World", "Platform Invoke Sample", 0);
DynamicDllImport是Mono发布的一个类,利用它我们可以直接调用WinAPI,这里调用了MessageBox函数。详细内容我会在下一篇文章《.NET4.0新特性之互操作》进行介绍。
动态语言运行
动态语言运行时 (DLR) 是一种运行时环境,它将一组适用于动态语言的服务添加到公共语言运行时 (CLR)。借助于 DLR,可以更轻松地开发要在 .NET Framework 上运行的动态语言,而且向静态类型化语言添加动态功能也会更容易。
动态语言可以在运行时标识对象的类型,而在类似 C# 和 Visual Basic 的静态类型化语言中(当您使用 Option Explicit On 时),您必须在设计时指定对象类型。动态语言的示例有:Lisp、Smalltalk、JavaScript、PHP、Ruby、Python、ColdFusion、Lua、Cobra 和 Groovy。
大多数动态语言都会向开发人员提供以下优点:
可以使用快速反馈循环(REPL 或读取-计算-打印循环)。这样,您就可以在输入几条语句之后立即执行它们以查看结果。
同时支持自上而下的开发和更传统的自下而上的开发。例如,当您使用自上而下的方法时,可以调用尚未实现的函数,然后在需要时添加基础实现。
更易于进行重构和代码修改操作,原因是您不必在代码中四处更改静态类型声明。
利用动态语言可以生成优秀的脚本语言。利用新的命令和功能,客户可以轻松地扩展使用动态语言创建的应用程序。动态语言还经常用于创建网站和测试工具、维护服务器场、开发各种实用工具以及执行数据转换。
DLR 的目的是允许动态语言系统在 .NET Framework 上运行,并为动态语言提供 .NET 互操作性。在 Visual Studio 2010 中,DLR 将动态对象引入到 C# 和 Visual Basic 中,以便这些语言能够支持动态行为,并且可以与动态语言进行互操作。
DLR 还可帮助您创建支持动态操作的库。例如,如果您具有一个使用 XML 或 JavaScript 对象表示法 (JSON) 对象的库,则对于使用 DLR 的语言,您的对象可以显示为动态对象。这使库用户能够编写语法更简单且更自然的代码,以便操作对象和访问对象成员。
DLR 体系结构
下图显示了动态语言运行时的体系结构。
DLR 向 CLR 中添加了一组服务,以便更好地支持动态语言。这些服务包括:
表达式树。DLR 使用表达式树来表示语言语义。为此,DLR 对 LINQ 表达式树进行了扩展,以便包括控制流、工作分配以及其他语言建模节点。有关更多信息,请参见表达式树(C# 和 Visual Basic)。
调用站点缓存。动态调用站点是代码中用于对动态对象执行类似 a + b 或 a.b() 的操作的位置。DLR 将缓存 a 和 b 的特性(通常是这些对象的类型)以及有关操作的信息。如果之前已执行过此类操作,则 DLR 将从缓存中检索所有必需的信息,以实现快速调度。
动态对象互操作性。DLR 提供一组表示动态对象和操作的类和接口,可供语言实施者和动态库的作者使用。这些类和接口包括ExpandoObjectIDynamicMetaObjectProvider、DynamicMetaObject、DynamicObject 和 。
DLR 通过在调用站点中使用联编程序,不仅可以与 .NET Framework 通信,还可以与其他基础结构和服务(包括 Silverlight 和 COM)通信。联编程序将封装语言的语义,并指定如何使用表达式树在调用站点中执行操作。这样,使用 DLR 的动态和静态类型化语言就能够共享库,并获得对 DLR 支持的所有技术的访问权。
C#与Python混合编程
下面演示在C#调用python代码,以下是python.py文件中的python代码
#类
class MyService(object):
def GetData(self, value):
return "hello" + value
#占位pass
pass
#方法
def MyFunction(name):
return "hello " * 8 + name
#读取文件
def read(file):
path=file
f=open(path,"r")
for line in f:
print("每一行的数据是:%s"%line)
f.close()
#默认值
def add(a,b=2):
return str(a+b)
下面是一直相对应的C#调用代码
//直接编写python
var engine = Python.CreateEngine();
engine.Execute("print(23)");
//调用文件中的python
var python = Python.CreateRuntime();
dynamic script = python.UseFile("python.py");
//调用Python里的类
var service = script.MyService();
var result = service.GetData("aaa");
Console.WriteLine(result);
//调用中的函
result = script.MyFunction("aaa");
//默认值
result = script.add(2);
Console.WriteLine(result);
//读取文件
script.read("python.py");
C# 4.0将通过新的元类型"dynamic"来添加对后期绑定的支持。任何直接声明为这种类型的变量,或者从函数中返回这种类型的值,都将自动地视为后期绑定。这类似于在Visual Basic中把变量声明为"object",不过它现在可以支持任何类型系统了,不仅仅是CTS(通用类型规范)和COM。
一个重要之处是,这个特性的目标就是为了支持后期绑定,以及更多地为了支持近来流行的动态绑定。动态类型明显不是C#的一个特性,不过是为了支持动态绑定的一个后果。
还要着重注意的一点是,反射并不是一种很好的替代方案。使用反射的问题在于,需要处理各种各样的类型。使用Reflection命名空间调用方法的方式和在ScriptObject上调用方法的方式并不相同。尤其,Ruby/Python方法这样的第三方方法。
dynamic ExpandoObject
熟悉js的朋友都知道js可以这么写 :
var t = new Object();
t.Abc = "something";
t.Value = 243;
现在这个js动态语言的特性,我们也可以在c#中使用了,前提是将一个变量声明为ExpandoObject类型。如下例:
static void Main(string[] args)
{
dynamic t = new ExpandoObject();
t.Abc = "abc";
t.Value = 10000;
Console.WriteLine("t's abc = {0},t's value = {1}", t.Abc, t.Value);
Console.ReadLine();
}
C# 4.0中新增了一个命名空间System.Dynamic来实现对此应用的支持,这种用法的意义何在,现在我还不太清楚,也是是c#向动态语言过渡的一种试探吧。以下展示的是dynamic可变类型特性
dynamic d = 1;
Console.WriteLine(d.ToString());
d = new DateTime();
Console.WriteLine(d.ToString());
d = "szl";
Console.WriteLine(d.ToString());
dymanic应用场景
按New features in CSharp 4的说法,dymanic主要应用于下面的场景:
1、自动反射
2、COM组件互操作
3、混合编程,例如IronRuby和IronPython
4、处理Html DOM对象
如果有处理过上面这些工作的朋友们,应该不难理解了吧。
有了dynamic的支持让我们看下更强大的功能吧:
反射调用
Type type = Type.GetType("ConsoleApplication1.Test");
dynamic t = Activator.CreateInstance(type);
t.Print("你好,szl,欢迎使用 CSharp 4.0!");
这里我们之间调用了ConsoleApplication1.Test类型中的Print方法,就行创建实例后调用一样,是不是很方便。
P/Invoke 调用
dynamic user32 = new DynamicDllImport("user32.dll",
callingConvention: CallingConvention.Winapi);
user32.MessageBox(0, "Hello World", "Platform Invoke Sample", 0);
DynamicDllImport是Mono发布的一个类,利用它我们可以直接调用WinAPI,这里调用了MessageBox函数。详细内容我会在下一篇文章《.NET4.0新特性之互操作》进行介绍。
动态语言运行
动态语言运行时 (DLR) 是一种运行时环境,它将一组适用于动态语言的服务添加到公共语言运行时 (CLR)。借助于 DLR,可以更轻松地开发要在 .NET Framework 上运行的动态语言,而且向静态类型化语言添加动态功能也会更容易。
动态语言可以在运行时标识对象的类型,而在类似 C# 和 Visual Basic 的静态类型化语言中(当您使用 Option Explicit On 时),您必须在设计时指定对象类型。动态语言的示例有:Lisp、Smalltalk、JavaScript、PHP、Ruby、Python、ColdFusion、Lua、Cobra 和 Groovy。
大多数动态语言都会向开发人员提供以下优点:
可以使用快速反馈循环(REPL 或读取-计算-打印循环)。这样,您就可以在输入几条语句之后立即执行它们以查看结果。
同时支持自上而下的开发和更传统的自下而上的开发。例如,当您使用自上而下的方法时,可以调用尚未实现的函数,然后在需要时添加基础实现。
更易于进行重构和代码修改操作,原因是您不必在代码中四处更改静态类型声明。
利用动态语言可以生成优秀的脚本语言。利用新的命令和功能,客户可以轻松地扩展使用动态语言创建的应用程序。动态语言还经常用于创建网站和测试工具、维护服务器场、开发各种实用工具以及执行数据转换。
DLR 的目的是允许动态语言系统在 .NET Framework 上运行,并为动态语言提供 .NET 互操作性。在 Visual Studio 2010 中,DLR 将动态对象引入到 C# 和 Visual Basic 中,以便这些语言能够支持动态行为,并且可以与动态语言进行互操作。
DLR 还可帮助您创建支持动态操作的库。例如,如果您具有一个使用 XML 或 JavaScript 对象表示法 (JSON) 对象的库,则对于使用 DLR 的语言,您的对象可以显示为动态对象。这使库用户能够编写语法更简单且更自然的代码,以便操作对象和访问对象成员。
DLR 体系结构
下图显示了动态语言运行时的体系结构。
DLR 向 CLR 中添加了一组服务,以便更好地支持动态语言。这些服务包括:
表达式树。DLR 使用表达式树来表示语言语义。为此,DLR 对 LINQ 表达式树进行了扩展,以便包括控制流、工作分配以及其他语言建模节点。有关更多信息,请参见表达式树(C# 和 Visual Basic)。
调用站点缓存。动态调用站点是代码中用于对动态对象执行类似 a + b 或 a.b() 的操作的位置。DLR 将缓存 a 和 b 的特性(通常是这些对象的类型)以及有关操作的信息。如果之前已执行过此类操作,则 DLR 将从缓存中检索所有必需的信息,以实现快速调度。
动态对象互操作性。DLR 提供一组表示动态对象和操作的类和接口,可供语言实施者和动态库的作者使用。这些类和接口包括ExpandoObjectIDynamicMetaObjectProvider、DynamicMetaObject、DynamicObject 和 。
DLR 通过在调用站点中使用联编程序,不仅可以与 .NET Framework 通信,还可以与其他基础结构和服务(包括 Silverlight 和 COM)通信。联编程序将封装语言的语义,并指定如何使用表达式树在调用站点中执行操作。这样,使用 DLR 的动态和静态类型化语言就能够共享库,并获得对 DLR 支持的所有技术的访问权。
C#与Python混合编程
下面演示在C#调用python代码,以下是python.py文件中的python代码
#类
class MyService(object):
def GetData(self, value):
return "hello" + value
#占位pass
pass
#方法
def MyFunction(name):
return "hello " * 8 + name
#读取文件
def read(file):
path=file
f=open(path,"r")
for line in f:
print("每一行的数据是:%s"%line)
f.close()
#默认值
def add(a,b=2):
return str(a+b)
下面是一直相对应的C#调用代码
//直接编写python
var engine = Python.CreateEngine();
engine.Execute("print(23)");
//调用文件中的python
var python = Python.CreateRuntime();
dynamic script = python.UseFile("python.py");
//调用Python里的类
var service = script.MyService();
var result = service.GetData("aaa");
Console.WriteLine(result);
//调用中的函
result = script.MyFunction("aaa");
//默认值
result = script.add(2);
Console.WriteLine(result);
//读取文件
script.read("python.py");
相关文章推荐
- NET4.0新特性动态语言
- 浅思OC的语言的动态特性
- Java 7新特性(九)——动态语言支持
- js:语言精髓笔记12--动态语言特性(2)
- 使用Spring Introducation 让Java类实现动态语言特性
- dynamic lookup将变得很强大,推导出很多动态语言特性,这是C#团队的功劳
- 理解Javascript的动态语言特性
- js:语言精髓笔记11--动态语言特性(1)
- 1.OC语言Swift特性,动态运行时,runtime,KVC ,KVO,MVC 设计模式
- PHP语言动态特性-面向切面
- PHP语言动态特性-面向切面
- python动态语言特性小结
- 一种 动态 样式 语言. LESS 将 CSS 赋予了动态语言的特性,如 变量, 继承, 运算, 函数. LESS 既可以在 客户端 上运行 (支持IE 6+, Webkit, Firefox),也可以借助Node.js或者Rhino在服务端运行。
- python动态语言特性小结
- C# 动态语言特性,dynamic 关键字研究
- less让css具有动态语言的特性
- 理解Javascript的动态语言特性
- 使用Spring Introducation 让Java类实现动态语言特性
- eval(expression, globals=None, locals=None)动态语言的特性(很棒)
- PHP语言的动态特性-Going dynamic with PHP