c#进阶-1.委托(delegate)与事件(event)

delegate

定义

委托是引用方法类型,是函数方法的容器,可以理解为表示函数的变量类型,用来存储函数。

委托本质是一个类,用来定义函数的类型(返回值和参数的类型),不同函数必须对应格式一致的委托,也就是返回值类型和参数要一致。

语法

访问修饰符 delegate 返回值 委托名(参数列表);

一般写在namespace中,类外。

基本使用

namespace test2
{
    //委托申明
    public delegate void Func1();
    public delegate void Func2(int a);
    class Program
    {
        static void Main(string[] args)
        {
            //第一种使用方式
            Func1 func1 = new Func1(f1);
            func1.Invoke();
            //第二种使用方式
            Func1 fun1 = f1;
            fun1();
            Func2 func2 = f2;
            func2(2);
            Console.ReadKey();
        }
        static void f1()
        {
            Console.WriteLine("123");
        }
        static void f2(int t)
        {
         
            Console.WriteLine("456");
        }
    }
}

可以看出委托就是存函数的容器,但为什么要存起来再用呢?以下说明

委托可以装载多个函数

例子:

static void Main(string[] args)
        {
            //第一种使用方式
            Func1 func1 = new Func1(f1);
            //func1.Invoke();
            //第二种使用方式
            Func1 fun1 = null;
            fun1 += f1;
            fun1 += f2;
            fun1 += f3;
            fun1();
            //移除委托容器
            fun1 -= f2;
            fun1();
            Console.ReadKey();
        }
        static void f1()
        {
            Console.WriteLine("水还有两分钟烧开");
        }
        static void f2()
        {            
            Console.WriteLine("水还有一分钟烧开");
        }
        static void f3()
        {
            Console.WriteLine("水烧开了");
        }

fun1在调用时,将会顺序执行刚才存储的函数,这里就很明显了,如果一系列动作需要执行,我们需要调用很多次,委托容器只需要调用一次。还有比如:热水器由三部分组成:热水器、警报器、显示器,它们来自于不同厂商并进行了组装。那么,应该是热水器仅仅负责烧水,它不能发出警报也不能显示水温;在水烧开时由警报器发出警报、显示器显示提示和水温。我们委托热水器完成这么多事情,对于它的子物件都要发生更新,这就用到观察者模式。

Observer设计模式是为了定义对象间的一种一对多的依赖关系,以便于当一个对象的状态改变时,其他依赖于它的对象会被自动告知并更新。

系统自带的委托

static void Main(string[] args)
        {
            //Action为无返回值委托,无参数
            Action action = f1;
            action();
            //Action有参数,泛型委托
            Action<int, string> action2 = f2;
            action2(1,"a");
            //Func为有返回值委托,有返回值无传参数
            Func<int> func3 = f3;
            func3();
            //第一个为传入参数类型,最后一个为返回值类型
            Func<string, int> func4 = f4;
            func4("abc");
            Console.ReadKey();
        }
        static void f1()
        {
            Console.WriteLine("123");
        }
        static void f2(int i,string s)
        {            
            Console.WriteLine("456");
        }
        static int f3()
        {
            Console.WriteLine("789");
            return 1;
        }
        static int f4(string s)
        {
            Console.WriteLine(s);
            return 1;
        }

事件(event)

事件是基于委托的存在,事件是委托的安全包裹,事件是特殊的委托。

语法:
访问修饰符 event 委托类型 事件名;

事件的使用:事件是作为成员变量存在与类中

为什么会有事件?
1.防止外部随意置空委托
2.防止外部调用委托
3.事件就是对委托的一次封装,更安全

事件与委托的区别

两者在用法上是一样的,
主要区别:
1.事件在类外不能赋值,可以+=和-=,委托可以
2.事件不能在类外执行,委托都可以
3.事件不能函数中的临时变量,委托可以

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页