美文网首页
C#委托、事件的定义及使用

C#委托、事件的定义及使用

作者: 浅谈码生活 | 来源:发表于2020-08-31 09:57 被阅读0次

在和大家讨论“委托”,“事件”,“lambda”及“linq”可能会使用更多的代码来表现具体的使用方式和大致原理。
委托声明
1.)可以声明在类的外面也可以在类的内部。
2.)委托跟方法很像,可以有返回值,有参数,用一个delegate关键字修饰。
3.)委托的本质其实是一个类,继承自MulticastDelegate特殊类 。

public delegate void NoReturnNoPara();
public delegate void NoReturnWithPara(int x, int y);
public delegate int WithReturnNoPara();
public delegate int WithReturnWithPara(out int x, ref int y);

Action / Func
1.)Action:是系统给我们提供的一个委托;是一个没有返回值,可以有参数的委托;最多可以有16个泛型参数;
2.)Func:是系统给我们提供的一个委托;是一一个必须有返回值的委托,可以有参数的委托;最多可以有16个泛型参数;

//有参数,无返回值
public delegate void Action<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11, in T12, in T13, in T14, in T15, in T16, in T17>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16, T17 Arg17);
//可以传参数,有返回值
public delegate TResult Func<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11, in T12, in T13, in T14, in T15, in T16, in T17, out TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16, T17 arg17);

事件
1.)事件其实是委托+event关键字,事件只能在声明当前这件事的类内部Invoke;
2.)事件其实是委托的一个实例,事件比委托更加安全;
下面是物品涨价通知,消费购买的一个发布订阅的示例

//事件的发布者,发布是按并且在满足条件的情况下,触发事件
public class FrameworkClass
{
            public int Id { get; set; }
            public string Name { get; set; }
            private int _price = 9;
            public int Price
            {
                get
                {
                    return _price;
                }
                set
                {
                    if (value > _price)
                    {
                        PriceIncrease.Invoke(this, new FrameworkEventArge()
                        {
                            OldPrice = _price,
                            NewPrice = value
                        });
                    }
                    _price = value;
                }
            }
            public event EventHandler PriceIncrease;
        }
}
// 订户,关注事件,事件触发之前,超市做出点动作
public class Supermarket
{
   public void Extension(object sender, EventArgs e)
    {
          FrameworkClass frameworkClass = (FrameworkClass)sender;
          FrameworkEventArge eventArge = (FrameworkEventArge)e;
          Console.WriteLine($"this is {frameworkClass.Name}");
          Console.WriteLine($"{frameworkClass.Name}之前的价格是{eventArge.OldPrice}");
          Console.WriteLine($"{frameworkClass.Name}现在要马上更新的价格是{eventArge.NewPrice}");
          Console.WriteLine("超市宣传。。。"); 
      }
}
// 订户: 关注事件,事件触发后,自己做出相应的动作
public class CustomInfo
{
    public void Buy(object sender, EventArgs e)
     {
           FrameworkClass frameworkClass = (FrameworkClass)sender;
           FrameworkEventArge eventArge = (FrameworkEventArge)e;
           Console.WriteLine($"this is {frameworkClass.Name}");
           Console.WriteLine($"{frameworkClass.Name}之前的价格是{eventArge.OldPrice}");
           Console.WriteLine($"{frameworkClass.Name}现在要马上更新的价格是{eventArge.NewPrice}");
           Console.WriteLine("果断买了。。。");
           Console.WriteLine($"{frameworkClass.Name}现在要马上更新的价格是{eventArge.NewPrice}");
      }
}
//订阅:就是个订户和事件发布者关联起来
Product.PriceIncrease += new Supermarket().Extension;
Product.PriceIncrease += new CustomInfo().Buy;
Product.Price = 10;

相关文章

  • C#委托、事件的定义及使用

    在和大家讨论“委托”,“事件”,“lambda”及“linq”可能会使用更多的代码来表现具体的使用方式和大致原理。...

  • C#中如何定义和使用一个自定义事件(2)

    在上一个示例中,使用.NET 自定义的委托定义定义事件,不使用自定义委托。 (1) 事件发布者 使用系统的委托Ev...

  • unity 委托事件

    定义委托及事件 实现事件监听+=(事件取消监听为-=)

  • 教小明学一点点编程—C#篇(0)

    像小明这样使用C#的新同学,一定都会被C#的复杂的委托事件机制所困惑,那么我们不如解释一下什么是C#中委托。 委托...

  • C#委托 匿名函数 Lambda

    C# 中委托的发展#在 C# 1.0 中,通过使用在代码中其他位置定义的方法显式初始化委托来创建委托的实例。 C#...

  • 第一部分:C#语言基础----委托和事件

    第3章 C#中的委托和事件 3.1 理解委托 3.1.1 将方法作为方法的参数 委托是一个类,它定义了方法的类型,...

  • 11.1学习总结

    今天回顾了委托,学习了事件。 事件是类在发生被关注的事情时用来提供通知的一种方式。 在C#中使用委托模型来实现事件...

  • 《设计模式》之总结

    设计模式在很早之前有明确的定义,使用意图,场景;但是在现代的很多编程语言中,就内置的设计模式,比如C#的事件、委托...

  • C# 基础知识系列- 11 委托和事件

    0. 前言 事件和委托是C#中的高级特性,也是C#中很有意思的一部分。出现事件的地方,必然有委托出现;而委托则不一...

  • 2017 10 30

    今天老师主要讲解了:委托和事件、委托的定义、声明、事件的定义,事件发布者的定义等内容。 委托的定义语, 返回类型 ...

网友评论

      本文标题:C#委托、事件的定义及使用

      本文链接:https://www.haomeiwen.com/subject/cptusktx.html