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

C#委托

什么是委托?

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

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

 C# 自定义委托delegate

  委托的定义:

  public delegate double dele(double value);
  public delegate Student del_Stu(int stId);
  public static   List<Student> lsst = new List<Student>();

        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;
        }

调用委托测试:

 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表达式、异步等等情况下需要用到。

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

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

  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;
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;
}

 测试调用:

  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();
  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值