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();
  }
相关推荐
isyangli_blog12 小时前
OpenDayLight (Carbon 版本) 启动与组件安装
开发语言·php
vb20081112 小时前
FastAPI APIRouter
开发语言·python
Benszen12 小时前
KVM虚拟化解决方案
开发语言·perl
会编程的土豆12 小时前
Go 语言反射(Reflection)详解
开发语言·后端·golang
東雪木12 小时前
多线程与并发编程 专属复习笔记
java·开发语言·笔记·java面试
杨充12 小时前
1.3 浮点型数据设计灵魂
开发语言·python·算法
噜噜噜阿鲁~12 小时前
python学习笔记 | 11.3、面向对象高级编程-多重继承
java·开发语言
basketball61613 小时前
Go 语言从入门到进阶:4. 数组和MAP使用方法总结
开发语言·后端·golang
春生野草13 小时前
反射、Tomcat执行
java·开发语言
雪的季节14 小时前
企业级 Qt 全功能项目
开发语言·数据库·qt