欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

IronPython0.9中的Examples VBVB.NETCC++C# 

程序员文章站 2022-07-04 17:37:07
...

        自从IronPython加入了与.NET 2.0一齐发展的行列之后,我的SharpDevelop就不好使了。没有办法,为了能够把IronPython0.9自带的几个Sample跑一跑,花了几天的时间,终于把Visual C# 2005 Express Edition Beta装上了。在聊聊IronPython0.9自带的Example之前,真的忍不住对Visual C# 2005赞叹一番:漂亮的界面,不错的启动速度,对UI开发鬼斧神工般的支持,实在太Cool了!
        抹掉了天花乱坠的唾沫星子,让我们来看看IronPython中的例子吧。在IronPython0.9中自带了两个Example,两个都涉及到了IronPython与C#之间交互的问题。Delegate这个例子主要是说明了在C#中声明了Delegate,而在IronPython文件中定义相应的Event Handler的情况。

IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C# IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C# public class Counter IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C# {
IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C#     
public int counter = 0;
IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C# }

IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C# 
IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C# IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C# 
public class Walker IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C# {
IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C#     
public delegate int ProcessRegular(XmlNode node);
IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C#      
IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C#     
public event ProcessRegular OnNodeRegular;
IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C# 
IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C# IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C#     
private int RegularWalk(XmlNode n, Counter cnt) IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C# {
IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C#         cnt.counter
++;
IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C#         
if (OnNodeRegular(n) == 0return 0;
IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C# IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C#         
foreach (XmlNode ch in n) IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C# {
IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C#             
if (RegularWalk(ch, cnt) == 0return 0;
IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C#         }

IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C#         
return 1;
IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C#     }

IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C# }

以上是Delegate.cs的部分代码,你会发现这里仅仅是声明了OnNodeRegular,并没有具体的方法体。而实际的方法体则是在IronPython文件中被定义的:

IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C# def OnNodeRegular(node):
IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C#     print 
"%s, %s, %s" % (str(node), str(node.Name), str(node.Value))
IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C#     
return 1
IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C# w.OnNodeRegular 
+= OnNodeRegular

这里为我们提供了使用Delegate的一种全新的途径:由IronPython去定义被C#代码调用的Event Handler,不同语言的协作性展现无遗。然而,Python不支持方法重载的特性或许会影响function充当Event Handler的通用性。
        而在另外一个例子Embedding中,我竟然没有找到熟悉的.py文件,颇感意外。于是打开其中的一个.cs文件一看,喔,熟悉的IronPython代码都跑到了C#代码中了。原来,Embedding的例子为我们展示了一种在C#中使用IronPython Script的方式。

IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C# IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C# public class Embed3 IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C# {
IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C#     
public static int Value = 0;
IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C#     
const string command =
IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C#         
"import Embed3                  \n" +
IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C#         
"Embed3.Value = 20              \n";
IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C# 
IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C# IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C#     
public static void Run() IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C# {
IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C#         PythonEngine engine 
= new PythonEngine();
IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C#         engine.LoadAssembly(
typeof(Embed3).Assembly);
IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C#         engine.Execute(command);
IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C#         Console.WriteLine(Value);
IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C#     }

IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C# }

IronPython0.9中的Examples
            
    
    
        VBVB.NETCC++C# 

代码的输出为20,Embed3中Value的值被IronPython Script改变了。这里实现的机制并不神秘,是通过Reflection来改变Value的值。
        关于例子本身,没有太多的东西可以罗嗦的了,毕竟例子只是告诉了我们如何去使用这样的一些特性。 我更愿意去想想这样的例子给我们带来的启示。两个例子都无一例外的展现了IronPython同C#之间良好的协作性,我不禁开始畅想在未来的Project当中会包含着两种语言,而开发团队也会由IronPython和C#程序员组成,使用不同的语言来开发不同的模块,让语言的优越性得到充分的发挥。也许你会觉得不同语言的协作性在.NET平台早以有之,用得着大惊小怪吗?但是我觉得在项目开发当中,真的会同时使用两种不同的.NET语言吗?C#和VB.NET的协作是IL层面上的,我们并没有办法将VB.NET的代码直接embed到C#的代码中。而在IronPython中,你可以选择将C#的代码Embed到IronPython的代码中(第一个例子),也可以选择将IronPython代码Embed到C#(第二个例子)中,这无疑为开发增加了更多的灵活性。 由于IronPython天生的轻量级特性,在C#代码中嵌入IronPython Script会有效地减少代码量,当然在程序的可维护性方面就可能有所下降了。不管怎么样,IronPython引入了一种新的不同语言的协作机制,也许它会成为你提高编码效率的选择。

PS:IronPython0.9.1在一个星期前,也就是8月23日发布了。期待1.0中……