IronPython0.9中的Examples

        自从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的情况。

ExpandedBlockStart.gifContractedBlock.gifpublic class Counter dot.gif {
InBlock.gif    
public int counter = 0;
ExpandedBlockEnd.gif}

None.gif
ExpandedBlockStart.gifContractedBlock.gif
public class Walker dot.gif {
InBlock.gif    
public delegate int ProcessRegular(XmlNode node);
InBlock.gif     
InBlock.gif    
public event ProcessRegular OnNodeRegular;
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
private int RegularWalk(XmlNode n, Counter cnt) dot.gif{
InBlock.gif        cnt.counter
++;
InBlock.gif        
if (OnNodeRegular(n) == 0return 0;
ExpandedSubBlockStart.gifContractedSubBlock.gif        
foreach (XmlNode ch in n) dot.gif{
InBlock.gif            
if (RegularWalk(ch, cnt) == 0return 0;
ExpandedSubBlockEnd.gif        }

InBlock.gif        
return 1;
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

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

None.gif def OnNodeRegular(node):
None.gif    print 
"%s, %s, %s" %  (str(node), str(node.Name), str(node.Value))
None.gif    
return 1
None.gifw.OnNodeRegular 
+= OnNodeRegular

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

ExpandedBlockStart.gifContractedBlock.gifpublic class Embed3 dot.gif {
InBlock.gif    
public static int Value = 0;
InBlock.gif    
const string command =
InBlock.gif        
"import Embed3                  \n" +
InBlock.gif        
"Embed3.Value = 20              \n";
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public static void Run() dot.gif{
InBlock.gif        PythonEngine engine 
= new PythonEngine();
InBlock.gif        engine.LoadAssembly(
typeof(Embed3).Assembly);
InBlock.gif        engine.Execute(command);
InBlock.gif        Console.WriteLine(Value);
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif

代码的输出为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中……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值