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