注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

随机过程

http://superware.blog.163.com

 
 
 

日志

 
 

Delegate (II) : dotGNU vs Mono  

2014-06-23 14:35:38|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

        GNU 的 dotGNU C# 编译器与 Mono C# 编译器对 C# 标准的实现是不同的,从实践来看,dotGNU 对标准的执行比较严格,同时对语法的一致性的坚持也比较严格。Mono 和 Microsoft Visual Studio .net 对标准和语法的一致性坚持就没有 dotGNU 严格,虽然微软是 .net 的设计者,但微软一向对用户宽松是有历史的。下面的两个例子就讨论上述结论:

一、Mono、Visual Studio .net 可以编译但 dotGNU 不能通过编译的例子:


using System;

namespace Delegate
{
delegate void MyDelegate (string name);

class Greeting
{
public void GreetCustomer (MyDelegate md, string name)
{
md (name);
}
}

class Customer
{
public void StrEnglish (string name)
{
Console.WriteLine ("Morning, " + name + "!");
}

public void StrChinese (string name)
{
Console.WriteLine ("早上好, " + name + "!");
}
}

class DelegateMain
{
static void Main (string[] args)
{
Greeting g = new Greeting ();
Customer c = new Customer ();

g.GreetCustomer (c.StrEnglish, "Jimmy"); // 将函数指针直接赋值给委托类型
g.GreetCustomer (c.StrChinese, "王五"); // 将函数指针直接赋值给委托类型
}
}
}

result:
Morning, Jimmy!

早上好,王五!

        上述例子在 Mono 和  Visual Studio .net 中可以编译成功,但在  dotGNU 中不能通过编译,因此从这个意义上说,dotGNU 对标准和语法一致性的坚持更严格。

        上述例子中直接将函数名赋值给委托类型,从 C/C++/C# 的语法一致性要求来看,这是需要隐式类型转换的,也就是将指针类型(函数名假设为指针类型)转换为委托类型。从 Visual Studio .net 的角度,这是对 C/C++ 的函数指针作为参数传递的直接实现,理解起来很容易,但容易给没有 C/C++ 经验的人带来迷惑,也没有坚持语法一致性的要求。


二、Mono、.net、dotGNU中都可以成功编译的例子:

        下面的实例是上述例子的改进版本,坚持了语法的一致性要求,可以在三种 C# 编译器中通过编译:

using System;

namespace Delegate
{
delegate void MyDelegate (string name);

class Greeting
{
public void GreetCustomer (MyDelegate md, string name)
{
md (name);
}
}

class Customer
{
public void StrEnglish (string name)
{
Console.WriteLine ("Morning, " + name + "!");
}

public void StrChinese (string name)
{
Console.WriteLine ("早上好, " + name + "!");
}
}

class DelegateMain
{
static void Main (string[] args)
{
Greeting g = new Greeting ();
Customer c = new Customer ();

MyDelegate md_en = new MyDelegate (c.StrEnglish); // 将委托声明为函数的替代
MyDelegate md_zh = new MyDelegate (c.StrChinese);

g.GreetCustomer (md_en, "Jimmy"); // 用委托调用 g.GreetCustomer 而不是像上例
g.GreetCustomer (md_zh, "王五"); // 那样用函数指针来调用。
}
}
}

result:

Morning, Jimmy!

早上好,王五!

  评论这张
 
阅读(90)| 评论(0)
推荐

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017