设为首页 加入收藏

TOP

C#中委托(一)
2019-09-17 16:25:53 】 浏览:28
Tags:委托

委托是一种安全地封装方法的类型,它与 C 和 C++ 中的函数指针类似。与 C 中的函数指针不同,委托是面向对象的、类型安全的和保险的。一个委托类型是代表与特定参数列表和返回类型的方法的引用类型。实例化委托时,可以将其实例与具有兼容签名和返回类型的任何方法相关联。您可以通过委托实例调用(或调用)该方法。委托用于将方法作为参数传递给其他方法。事件处理程序只不过是通过委托调用的方法。您可以创建自定义方法,并且诸如Windows控件之类的类可以在发生特定事件时调用您的方法。

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 ShowM
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇ASP.NET生命周期事件顺序 下一篇C#中泛型的解释(object,list,var..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目