在C#中,一个比较漂亮的语法就是delegate,它的“+=”操作符很优雅地使众多事件订阅者能够被一个调用所触发。如:

csharp
 1class Program
 2{
 3    delegate void DelegateFoo();
 4
 5    static void Foo() { Console.WriteLine("Foo"); }
 6
 7    static void Foo2() { Console.WriteLine("Foo2"); }
 8
 9    static void Main()
10    {
11        DelegateFoo d = new DelegateFoo(Foo);
12        d += Foo2;
13        d();
14    }
15}
16
17// Output:
18//   Foo
19//   Foo2

这项语法,被很多C#使用者大为称道。其实在C++的boost库中,也有同样功能的实现,一点不比C#的delegate差,那就是boost::signal:

cpp
 1#include <iostream>
 2#include <boost/signal.hpp>
 3
 4void Foo() { std::cout << "Foo" << std::endl; }
 5
 6void Foo2() { std::cout << "Foo2" << std::endl; }
 7
 8int main()
 9{
10    boost::signal<void ()> s;
11    s.connect( Foo );
12    s.connect( Foo2 );
13    s();
14    return 0;
15}
16
17// Output:
18//   Foo
19//   Foo2

参考:

  1. http://msdn.microsoft.com/en-us/library/aa288459(VS.71).aspx
  2. http://www.boost.org/doc/libs/1_39_0/doc/html/signals/tutorial.html#id3341837

评论(备份自LiveSpace):

  • 2009-05-18 - Alan Chen: 小疯想说这个能做那个也能做?
    没必要吧,不同点仅仅是使用者的习惯吧
  • 2009-05-18 - 颜林林: “这个能做那个也能做”的确是小疯想表达的一层意思。毕竟delegate受限于C++语法而难以直接实现,而boost却实现了大量类似的C++奇迹,不得不让人称赞。
    C++(和boost)的这种伸缩性,使得它即使在诸如开发企业应用等“非擅长”的领域,也并不比公认的C#等语言差太多。
    表面上看是使用习惯不同,实质上是编程思想的差异。
    总结下来,每一件神器都是有灵性的,能发挥多大法力,关键还在于使用者的修炼。