【转】C#笔记之委托(Delegate)(一)

原文: 小贱学C#笔记之委托(Delegate)(一) 

本来因为之前接口那篇文章很多坛友给提了一些意见,花了一上午事件码了篇接口和抽象类比较和理解,谁知道。。。谁知道。。。不就打错了验证码么,木有了全都木有了?!恢复的只有一个标题好伤心~要再来一遍,今天是真没那个心情了,收拾收拾我这受伤的心灵,换个话题,抽象类就等下一回吧!好了,开始!

首先我们先理解下委托到底有什么用。我的理解呢就是,我找个人帮我干活,嘿嘿~不理解?等我给你个情景,一个是我家里没请保姆,一个是我请了个保姆。

[code]csharpcode:

using System;
using System.Collections.Generic;

class XiaoJian // 写一个“小贱”类,嘿嘿,也就是我了,看下面有那么多活要做,现在我还没有请保姆
{
    public string WashTheDishes() // 洗碗T。T
    {
        return "洗碗洗碗。。。";
    }

    public string CleanTheFloor() // 扫地T。T
    {
        return "扫地扫地。。。";
    }

    public string WashTheClothes() // 洗衣服T。T
    {
        return "洗衣洗衣。。。";
    }
}

[code]csharpcode:

using System;
using System.Collections.Generic;

class DoHousework // 这个类就是做家务了
{
    static void Main(string[] args)
    {
        XiaoJian xiaoJian = new XiaoJian(); // 这个也就是我,可以看到下面所有的活都是我在干
        Console.WriteLine(xiaoJian.WashTheDishes());
        Console.WriteLine(xiaoJian.CleanTheFloor());
        Console.WriteLine(xiaoJian.WashTheClothes());

        Console.ReadKey();
    }
}
来看下结果

接下来,我给家里雇了一个保姆

[code]csharpcode:

using System;
using System.Collections.Generic;

public delegate string Nanny(); // 这个呢就是在人才市场登记下,告诉他我要雇保姆,可以看到下面我要做的活都没有变

class XiaoJian
{
    public string WashTheDishes()
    {
        return "洗碗洗碗。。。";
    }

    public string CleanTheFloor()
    {
        return "扫地扫地。。。";
    }

    public string WashTheClothes()
    {
        return "洗衣洗衣。。。";
    }
}

[code]csharpcode:

using System;
using System.Collections.Generic;

class DoHousework
{
    static void Main(string[] args)
    {
        XiaoJian xiaoJian = new XiaoJian();
        Nanny nanny = new Nanny(xiaoJian.WashTheDishes); // 这里我们找来个保姆,立马就给她安排了洗碗的工作
        Console.WriteLine(nanny());
        nanny += xiaoJian.CleanTheFloor; // 这里是告诉她洗了碗之后把地扫了
        Console.WriteLine(nanny());
        nanny += xiaoJian.WashTheClothes; // 这里是告诉她扫地之后再去洗衣服
        Console.WriteLine(nanny());

        Console.ReadKey();
    }
}

来看下结果

眼尖的童鞋发现,既然有了保姆,我还待在家里干嘛呢,那我接下来我就不要new出来了***要把多余的XiaoJian xiaoJian = new XiaoJian();去掉***

[code]csharpcode:

using System;
using System.Collections.Generic;

public delegate string Nanny();

class XiaoJian // 有没有在这个类中发生了什么变化?对,所有的方法都变成了静态方法
{
    public static string WashTheDishes()
    {
        return "洗碗洗碗。。。";
    }

    public static string CleanTheFloor()
    {
        return "扫地扫地。。。";
    }

    public static string WashTheClothes()
    {
        return "洗衣洗衣。。。";
    }
}

[code]csharpcode:

using System;
using System.Collections.Generic;

class DoHousework // 回到做家务这个类中,我已经不用再new出来了!
{
    static void Main(string[] args)
    {
        Nanny nanny = new Nanny(XiaoJian.WashTheDishes);
        Console.WriteLine(nanny());
        nanny += XiaoJian.CleanTheFloor;
        Console.WriteLine(nanny());
        nanny += XiaoJian.WashTheClothes;
        Console.WriteLine(nanny());

        Console.ReadKey();
    }
}

看来这个案例,还不知道委托干嘛用?好吧,给你总结下:

1.委托就是原来要你自己做的是叫别人去干就行了,比如,xiaoJian.WashTheDishes()==>nanny += XiaoJian.WashTheDishes;你只要告诉她要做什么(比如,nanny += XiaoJian.CleanTheFloor;),安排好以后说,干活去吧(nanny())!

2.来看看委托怎么去用

(1)先在人才市场登记下,告诉他我要雇保姆,比如,public delegate string Nanny();

(2)然后需要的时候雇个保姆,比如,Nanny nanny = new Nanny(XiaoJian.WashTheDishes); 记得给她安排工作,如果闲着雇她干嘛

(3)如果还有别的事要她做呢就用+=告诉她,比如,nanny += XiaoJian.CleanTheFloor;同样的,有件事不用她做了就用-=,比如,nanny -= XiaoJian.CleanTheFloor;

(4)事情安排好了就告诉她,去干活吧!GO GO GO!比如,nanny();

这样行了吧?明白没?!

原文地址:https://www.cnblogs.com/sbCat/p/4645778.html