C#上位机开发之旅-C#委托事件的那点事儿[1]

C#委托
什么是委托?

C#中的委托是一个类型,它描述了一个方法的签名,即方法的参数类型和返回类型。委托可以看作是一个指向方法的引用,使得我们可以像使用函数指针一样调用这些方法。

  • 将一个或多个方法作为参数传递给另一个方法,从而在需要时调用这些方法。
  • 实现事件处理程序。
  • 实现回调方法。
  • 实现异步编程等功能。

C# 自定义委托delegate

委托的定义:

cs 复制代码
  public delegate double dele(double value);
  public delegate Student del_Stu(int stId);
  public static   List<Student> lsst = new List<Student>();
cs 复制代码
        public class delTest
        {
            public double value =""; 
            public double SetValue(double value)
            {
                return new Random().NextDouble() / value;
            }

            Student st = new Student();
            public Student FindStudentById(int ids)
            {
                var st = lsst.Where(x => x.id == ids).ToList().SingleOrDefault();
                var t = lsst.Find(x => x.id == ids).GetHashCode();
                return null;
                //return new Student() { id = 1, age = 10, name = "张三" };
            }
        }

        public class Student
        {
            public int id;
            public string name;
            public int age;
        }

调用委托测试:

cs 复制代码
 static void Main(string[] args)
 {
     var del = new dele(new delTest().SetValue);
     //Console.WriteLine(del(1.2));
     //Console.WriteLine(del?.Invoke(2.2));
     lsst = new List<Student>(){ 
        new Student() { id = 1, age = 10, name = "张三1" },
        new Student() { id = 2, age = 11, name = "张三2" },
        new Student() { id = 3, age = 12, name = "张三3" },
        new Student() { id = 4, age = 13, name = "张三4" },
        new Student() { id = 5, age = 14, name = "张三5" }
     };

     var del2 = new del_Stu(new delTest().FindStudentById);
     var tt =  del2(1);
     Console.WriteLine($"当前学生名称为{tt.name}");

     Console.ReadKey();
 }

C#特殊委托事件,系统自带

使用传统的委托方式转变为更简洁的Action和Func在编程中的应用,强调了Action用于无返回值操作,Func则适用于有返回值的情况,以提升代码的清晰度和效率。

委托是一个类,定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。

把一个 参数类型 返回值 相同 方法名不同 的方法当变量 的方法 叫委托。

为了实现程序的六大设计中的开闭原则:解耦,对修改关闭,对扩展开放。逻辑分离。

直接调用函数和使用委托调用函数的区别就是是否方便对外扩展。

当我们窗体传值、线程启动时绑定方法、lambda表达式、异步等等情况下需要用到。

事件是一种特殊的委托,本质就是委托,事件是回调机制的一种应用。

当委托调用的函数达到某种条件时,可以通过回调通知调用者。

cs 复制代码
  public static event Action getData = null;

  public static event Action<int, int> getSum = null; 

  public static event Action<Teacher> getNewteacher = null;

  public static event Func<int, int> setValue = null;

  public static event Func<Teacher, bool> SetTeacher = null;
cs 复制代码
public class ClassEvtTest
{

    public int sumResult;

    public Teacher tc =new Teacher();
    public void CwText()
    {
        Console.WriteLine("测试打印消息...");
    }

    public void GetSumResult(int i,int j)
    {
        this.sumResult = i + j;
        return;
    }

    public int SetDataAddSelf(int s)
    {
        return s += 1; 
    }
    public void SetNewTeacher(Teacher tch)
    {
        tch.id = 1;
        tch.name = "王二狗";
    }


    public bool SetTeacher(Teacher tch)
    {
        tch = new Teacher() { id = 5, name = "赵三八" };
        if (tch.id != 5)
        {
            return false;
        }
        else
        {
            return true;
        }
    }
}

public class Teacher
{
    public int id;
    public string name;
}

测试调用:

cs 复制代码
  static void Main(string[] args)
  {
      ClassEvtTest ss = new ClassEvtTest();
      getData = new ClassEvtTest().CwText;
      getData.Invoke();//invoke()调用执行
      getData(); //简写

      getSum = ss.GetSumResult;
      getSum.Invoke(4, 8);
      Console.WriteLine(ss.sumResult);
      getSum(4, 5);
      Console.WriteLine(ss.sumResult);
      setValue = ss.SetDataAddSelf;
      var t1 = setValue.Invoke(8);
      Console.WriteLine(t1);

      Teacher tc = new Teacher();
      getNewteacher = ss.SetNewTeacher;
      getNewteacher.Invoke(tc);
      Console.WriteLine($"这个吊毛得名字是:{tc.name}");

      Console.WriteLine($"-----------------------");
      Teacher tc2 = new Teacher();
      SetTeacher = ss.SetTeacher;
      var flag = SetTeacher.Invoke(tc2);
      Console.WriteLine($"这个吊毛得名字是:{tc2.name}"); 
      Console.WriteLine($"这个吊毛得名字是:{flag}");


      Console.ReadKey();
  }
相关推荐
学java的小菜鸟啊13 分钟前
第五章 网络编程 TCP/UDP/Socket
java·开发语言·网络·数据结构·网络协议·tcp/ip·udp
云草桑13 分钟前
逆向工程 反编译 C# net core
前端·c#·反编译·逆向工程
立黄昏粥可温18 分钟前
Python 从入门到实战22(类的定义、使用)
开发语言·python
PerfMan21 分钟前
基于eBPF的procstat软件追踪程序垃圾回收(GC)事件
linux·开发语言·gc·ebpf·垃圾回收·procstat
聆听HJ29 分钟前
java 解析excel
java·开发语言·excel
溪午闻璐32 分钟前
C++ 文件操作
开发语言·c++
环能jvav大师41 分钟前
基于R语言的统计分析基础:使用SQL语句操作数据集
开发语言·数据库·sql·数据分析·r语言·sqlite
吱吱鼠叔1 小时前
MATLAB方程求解:1.线性方程组
开发语言·matlab·php
Antonio9151 小时前
【CMake】使用CMake在Visual Studio内构建多文件夹工程
开发语言·c++·visual studio
LyaJpunov1 小时前
C++中move和forword的区别
开发语言·c++