Fighting Ant

Ant can be great while elephant can be chickenshit

导航

再谈代理

Posted on 2008-07-08 21:54  Nillson  阅读(248)  评论(0编辑  收藏  举报

代理类似于C++中的函数指针,其作用都是为了完成对某一个函数细节的调用,但是函数指针破坏了类的封装性原则,而代理则是类型安全的,也维护了类的封装性。

代理的对象可以是一个命名过的方法或者是匿名的方法,但是在代理的过程中,方法的参数和返回值一定要和代理的参数和返回值相符合。假如我们声明这样的一个代理

public delegate void VoidDelegate(string str);

那么意味着这个代理只能代理返回值为void的并且带有一个string类型参数的方法,不满足这两个条件中的任何一个,在编译时候都不可能通过。

另外代理还支持匿名代理。如下面这段代码:

VoidDelegate v2 = delegate(string str)
{
       Console.WriteLine(str);
};//注意这个分号

在这里由于VoidDelegate是带一个string参数但是没有返回值的代理,在匿名代理的实现中就没有返回值。

如果我们声明了这样的一个代理:

public delegate string VoidDelegate(string str);

那么我们这段匿名代理就需要写成这样:

VoidDelegate v2 = delegate (string str)
{
        Console.WriteLine(str);
        return str;
};//同样注意这个分号

匿名代理不需要显式的指明返回类型,但是需要在方法里边返回一个string类型的值。

附一段测试的code

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    public delegate string VoidDelegate(string str);
    class DelegateTest
    {
        public static void Main()
        {
            DelegateTest dt = new DelegateTest();
            dt.Execute();
        }
        public static string Method1(string str)
        {
            Console.WriteLine(str);
            return str;
        }
        public void Execute()
        {
            VoidDelegate v1 = Method1;
            VoidDelegate v2 = delegate (string str)
            {
                Console.WriteLine(str);
                return str;
            };
            v1("hello");
            v2("World");
        }
    }
}