C#中Delegate

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

namespace Ch1
{

    public delegate void GreetingDelegate(string name);//委托

    public class FirstDelegate
    {
        public static void GreetingChinese(string name)
        {
            Console.WriteLine("早上好:" + name);
        }

        public static void GreetingEnglish(string name)
        {
            Console.WriteLine("Good morning:" + name);
        }
    }

    public class GreetingManager
    {
        public static GreetingDelegate MakeLanguageByDelegate;
        public static void GreetingPeople(string name)
        {
            if (MakeLanguageByDelegate != null)
            {
                MakeLanguageByDelegate(name);
            }
        }

        public static event GreetingDelegate MakeLanguageByEvent;//事件,不管是不是声明为public,它总是被声明为private

        public static void GreetingPeopleEvent(string name)
        {
            if (MakeLanguageByEvent != null)
            {
                MakeLanguageByEvent(name);
            }
        }

    }

    public class FirstDelegate1
    {
        public void GreetingChinese(string name)
        {
            Console.WriteLine("早上好:" + name);
        }

        public void GreetingEnglish(string name)
        {
            Console.WriteLine("Good morning:" + name);
        }
    }

    public class GreetingManager1
    {
        public GreetingDelegate MakeLanguageByDelegate;
        public void GreetingPeople(string name)
        {
            if (MakeLanguageByDelegate != null)
            {
                MakeLanguageByDelegate(name);
            }
        }

        public event GreetingDelegate MakeLanguageByEvent;

        public void GreetingPeopleEvent(string name)
        {
            if (MakeLanguageByEvent != null)
            {
                MakeLanguageByEvent(name);
            }
        }

    }

}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Ch1
{
    /**
     * Observer模式定义对象间的一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。
     * 水烧开的时候通知报警器和显示器
     * */
    public class WaterDelegate
    {
        private int temperature = 0;
        public delegate void BoilHandler(int param);//声明委托
        public event BoilHandler BoilEvent;//声明事件

        public void BoilWater()
        {
            for (int i = 0; i <= 100; i++)
            {
                temperature = i;
                if (temperature >= 95) //温度大于95警告并且显示温度
                {
                    if (BoilEvent != null) //如果有对象注册
                    {
                        BoilEvent(temperature); //调用所有注册方法
                        Console.WriteLine("-----------------");
                    }
                }
            }
        }
    }

    //报警
    public class Alarm
    {
        public void MakeAlert(int temperature)
        {
            Console.WriteLine("Alarm:嘀嘀嘀,水已经 {0} 度了:", temperature);
        }

        /**
         * .Net Framework中的委托与事件
         * 委托声明原型中的Object类型的参数代表了Object,也就是监视对象,在本例中是 Heater(热水器)。回调函数(比如Alarm的MakeAlert)可以通过它访问触发事件的对象(Heater)。
         * EventArgs 对象包含了Observer所感兴趣的数据,在本例中是temperature。
         * */
        public void MakeAlert(Object sender, BoiledEventArgs e)
        {
            Heater heater = (Heater)sender;
            Console.WriteLine("Alarm:{0} - {1}, 嘀嘀嘀,水已经 {2} 度了 ", heater.area, heater.type, e.temperature);
        }
    }

    //显示
    public class Display
    {
        public static void ShowMessage(int temperature)
        {
            Console.WriteLine("Display:水快烧开了,当前温度:{0}度。", temperature);
        }

        public static void ShowMessage(Object sender, BoiledEventArgs e)
        {
            Console.WriteLine("Display:水快烧开了,当前温度:{0}度。", e.temperature);
            Console.WriteLine();
        }
    }

    public class Heater
    {
        private int temperature;

        public string area { get; set; }    //添加地区
        public string type { get; set; }   //添加类型

        public delegate void BoiledEventHandler(Object sender, BoiledEventArgs e);//委托
        public event BoiledEventHandler Boiled;//事件

        // 可以供继承自 Heater 的类重写,以便继承类拒绝其他对象对它的监视
        protected virtual void OnBoild(BoiledEventArgs e)
        {
            if (Boiled != null) //如果有对象注册
            {
                Boiled(this, e); //调用所有注册方法
            }
        }

        public void BoilWater()
        {
            for (int i = 0; i <= 100; i++)
            {
                temperature = i;
                if (temperature >= 95) //温度大于95警告并且显示温度
                {
                    BoiledEventArgs e = new BoiledEventArgs(temperature);
                    OnBoild(e);
                }
            }
        }
    }

    // 定义BoiledEventArgs类,传递给Observer所感兴趣的信息
    public class BoiledEventArgs : EventArgs
    {
        public readonly int temperature;

        public BoiledEventArgs(int temperature)
        {
            this.temperature = temperature;
        }
    }
}
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace Ch1
{
    class Program
    {
        static void Main(string[] args)
        {
            //------------------------静态处理方法------------------------
            //GreetingManager.MakeLanguageByDelegate = FirstDelegate.GreetingEnglish;
            //GreetingManager.GreetingPeople("jason hua");

            //GreetingManager.MakeLanguageByDelegate = FirstDelegate.GreetingChinese;
            //GreetingManager.GreetingPeople("杰");

            //GreetingManager.MakeLanguageByEvent += FirstDelegate.GreetingEnglish;
            //GreetingManager.GreetingPeopleEvent("Jason Hua");

            //GreetingManager.MakeLanguageByEvent += FirstDelegate.GreetingChinese;
            //GreetingManager.GreetingPeopleEvent("杰");

            //-----------------------普通处理方法-------------------------------
            //FirstDelegate1 fd = new FirstDelegate1();
            //GreetingManager1 gm = new GreetingManager1();
            //gm.MakeLanguageByDelegate = fd.GreetingEnglish;//注册对象
            //gm.GreetingPeople("jason hua");

            //gm.MakeLanguageByDelegate = fd.GreetingChinese;//注册对象
            //gm.GreetingPeople("杰");
            //Console.WriteLine();
            //gm.MakeLanguageByEvent += fd.GreetingEnglish;//注册对象
            //gm.GreetingPeopleEvent("jason hua");

            //gm.MakeLanguageByEvent += fd.GreetingChinese;//注册对象
            //gm.GreetingPeopleEvent("杰");

            //普通的项目中的例子
            //WaterDelegate wd = new WaterDelegate();
            //Alarm alarm = new Alarm();

            //wd.BoilEvent += alarm.MakeAlert;//注册对象
            //wd.BoilEvent += Display.ShowMessage;//注册静态对象

            //wd.BoilWater();

            //仿微软的事件与委托,项目中的小例子
            Heater heater = new Heater();
            Alarm alarm = new Alarm();

            heater.area = "河南";
            heater.type = "九阳";
            heater.Boiled += alarm.MakeAlert;
            heater.Boiled += Display.ShowMessage;

            heater.BoilWater();

            Console.ReadLine();
        }
    }
}

引言委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里别(biè)得慌,混身不自在。本文中,我将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.Net Framework中的委托和事件、委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论。

参看网址:http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx

时间: 2024-10-16 18:35:50

C#中Delegate的相关文章

转iOS中delegate、protocol的关系

iOS中delegate.protocol的关系 分类: iOS Development2014-02-12 10:47 277人阅读 评论(0) 收藏 举报 delegateiosprocotolcategoryobject-c 刚开始接触iOS,对delegate.protocol这两个概念比较模糊.参考了一些资料,记录下来体会. 1.protocol protocol和interface的概念类似,是object-c语法的一部分.protocol就是一系列不属于任何类的方法的列表.其中声明

jQuery中delegate与on的用法与区别

在jQuery1.7中 .delegate()已被.on()取代.对于早期版本,它仍然使用事件委托的最有效手段. 在事件绑定和委派,delegate()和on在一般情况下,这两种方法是等效的. .delegate() 指定的元素(属于被选元素的子元素)添加一个或多个事件处理程序,并规定当这些事件发生时运行的函数. // jQuery 1.4.3+ $( elements ).delegate( selector, events, data, handler ); // jQuery 1.7+ $

iOS 中delegate的理解与使用(传值)

之前做了半年的iOS,刚入了门,又被拉去转战java,现在iOS的那位大佬离职了,又被弄过来维护app,之前对于iOS中的delegate一直都是半知半解,所以刚好趁着这个机会把我所了解的记下来,以便日后查阅. - delegate的理解 delegate, 也就是代理模式(设计模式的一种),我现在所了解的代理模式是,当我有事要做但是没空的时候,我就可以请别人帮下忙,我告诉你我要做什么,但是具体怎么做,那是你的事了,就比如说,我想去约个妹纸出来玩,但是自己刚好现在有事不能约,或者自己不好意思约,

.net中delegate的使用

js中的写法: var GetEntityList = function(pParameter){ var list =[]; return list; }; var aEntityList = GetEntityList({}); c#中的写法: Func<dynamic, List<dynamic>> GetEntityList = delegate (dynamic pParameter) { var list = new List<dynamic>(); ret

swift 中delegate的使用

今天写了delegate,遇到以下问题: 这里protocol的写法有问题,如果你的协议代表了一个实现了莫个函数的object,在oc里是这样写 id<protocol>,而在swift中,应该这样写: protocol MyPickerViewDelegate: NSObjectProtocol { func pickerConfirm(content:String) } 这也是因为,除了class 外,struct和enum也能实现协议,但是他们都是值类型,不是引用类型!

【转载】iOS中delegate,notification,KVO三种模式实现通信的优缺点

原帖地址:http://blog.csdn.net/yangxt/article/details/8176636 在开发iOS中,有三种模式来实现controller之间的通信: 1.委托delegation: 2.通知中心Notification Center: 3.键值观察key value observing,KVO 因此,那为什么我们需要这些模式以及什么时候用它以及什么时候不用它. 1.delegate 基本特征: 一 个controller定义了一个协议(即一系列的方法定义).该协议描

C#知识点总结系列:3、C#中Delegate和Event

一.Delegate委托可以理解为一个方法签名. 可以将方法作为另外一个方法的参数带入其中进行运算.在C#中我们有三种方式去创建委托,分别如下: public delegate void Print(string str); static void delegatemethod(string str) { Console.WriteLine(str); } public static void Main() { #region 委托 //1.普通委托 var print1 = new Print

iOS中delegate代理对象使用weak和assign哪个?

在定义delegate对象的时候,我们经常看到可以使用weak 和 assign 但是到底哪个使用更合适呢? 首先:使用assign,声明的对象即使对象销毁了,但是指针依然存在,这样造成声明的对象变成了野指针,这样导致内存泄露. 而使用 weak ,当对象销毁时,即将delegate = nil,这样不会产生野指针这种情况出现. 所以答案很明显 我们在定义代理对象的时候,通常使用weak来修饰.

C#知识点总结系列:3、C#中Delegate和Event以及它们的区别

1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取锁之后因为异常,致锁无法释放,所以需要在try{} catch(){}之后的finally{}结构体中释放锁(Monitor.Exit()). 2.Monitor的常用属性和方法: Enter(Object) 在指定对象上获取排他锁. Exit(Object) 释放指定对象上的排他锁. IsEntered 确定当前线程