【转】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();

这样行了吧?明白没?!

时间: 2024-10-15 07:04:42

【转】C#笔记之委托(Delegate)(一)的相关文章

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

原文:小贱学C#笔记之委托(Delegate)(二) 上次聊了下委托(delegate),简单的介绍了下使用方法,顺便问下你家保姆干活还行么?今天我们来看看事件(event). 事件实际上是一种特别的委托,通常声明事件的话要声明一个委托,它是这样的: [code]csharpcode: public delegate void EventHandler(object sender, EventArgs e); 是不是发现了些什么区别,对,参数!(object sender,EventArgs e

读书笔记(委托)

委托回调静态方法和实例方法有何区别 当委托绑定静态方法时,内部的对象成员变量_target会被设置成null 当委托绑定实例方法是,_target将会设置成指向该实例方法所属的一个实例对象 当委托被执行时,该对象实例将会用来调用实例方法 1 class DelegateReturn 2 { 3 public delegate String GetStringDelegate(); 4 5 static string GetTypeName() 6 { 7 return typeof(Delega

重构笔记——隐藏“委托关系”

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/43769929         在上一篇文章中介绍了"将类内联化".本文将介绍"隐藏委托关系"这种重构手法.         下面让我们来学习这种重构手法吧. 开门见山         发现:客户通过一个委托关系来调用另一个对象. 解决:在服务类上建立客户所需的所有函数,用以隐藏委托关系. 动机 我们都知道,"封装&q

C#用委托(Delegate)的BeginInvoke和EndInvoke方法操作线程

C#用委托(Delegate)的BeginInvoke和EndInvoke方法操作线程C# 2011-03-05 13:06:24 阅读19 评论0   字号:大中小 订阅 用委托(Delegate)的BeginInvoke和EndInvoke方法操作线程 在C#中使用线程的方法很多,使用委托的BeginInvoke和EndInvoke方法就是其中之一. BeginInvoke方法可以使用线程异步地执行委托所指向的方法.然后通过EndInvoke方法获得方法的返回值(EndInvoke方法的返回

c# 委托 delegate

委托是一种存储函数引用的类型,在事件和事件的处理时有重要的用途 通俗的说,委托是一个可以引用方法的类型,当创建一个委托,也就创建一个引用方法的变量,进而就可以调用那个方法,即委托可以调用它所指的方法. 使用委托 委托的使用需要以下步骤: 定义委托 delegate double ParocessDelegate(double param1,double param2); 委托的定义非常类似于函数,但不带函数体,且要使用delegate关键字.委托定义需要指明委托名称以及一个返回类型和一个参数列表

委托 delegate

c# 的委托就是说把函数当参数来传递. 这个在js完全就用不着搞什么委托东西,直接转就是了嘛.对不对!怎么录嘛! 一个函数,如果它的参数是函数,那么是这样子写的 public void method(Action<string, Int32> voidMethod, Func<string, Int32> returnMethod) Action<string, Int32> voidMethod 的意思是说这个将被传进来的函数是一个没有return的函数,就是publ

理解委托(delegate)及为什么要使用委托

理解委托(delegate)及为什么要使用委托 委托:是一种定义方法签名的类型. 当实例化委托时,您可以将其实例与任何具有兼容签名的方法相关联. 您可以通过委托实例调用方法. 上述为官方说法,理解起来比较难,举个生活中的例子: 某人有三子,让他们各自带一样东西出门,并带回一头猎物.上面一句话可以理解为父亲对儿子的委托:猎物 办法(工具 某工具)-->delegate 猎物(返回值) 带回猎物(委托名)(工具(参数类型) x)-->delegate int GetValue(int i)三个人执

关于C# 委托(delegate)与事件(event)的用法及事例

C#中的委托和事件对于新手可能会有一点难理解,所以先从一个小例子入手,以便能更好的理解其如何使用.有一个学生每天定闹钟在早上6点起床,所以当每天早上6点的时候,闹钟就会响起来,从而学生才会按时起床. 上面例子实际上包括2个类,一个是学生类(Student),一个是闹钟类(Ring).此时,让我们仔细想想,当闹钟到点后如何通知学生呢?当然不要说,闹钟响了,学生能听到这样的话23333,现在是写程序,一切用程序说话.也就是说当时间到了,闹钟类里应该有个给学生发消息的方法(OnSendMessage(

Unity3D游戏开发之委托(Delegate)

Unity3D游戏开发之委托(Delegate) 1.定义 delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类.与其它的类不同,delegate类能够拥有一个签名(signature),并且它"只能持有与它的签名相匹配的方法的引用". 它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m. delegate是面向对象.类型安全.可靠的受控(managed)对象.也就是说,运行时能够保证delegate指向一个有效的方法,你无须担心