公司动态

c#学习 8.15委托

📅 2026/8/16 6:27:15
c#学习 8.15委托
委托讲解1.什么是委托usingSystem;namespaceDelegateDemo{internalclassProgram{// delegate委托代理的意思// 声明一个委托类型它可以指向“没有参数、没有返回值”的方法delegatevoidNoParamDelegate();// 声明一个委托类型它可以指向“有一个int参数、没有返回值”的方法delegatevoidIntParamDelegate(intvalue);// 该方法签名与 NoParamDelegate 一致无参无返回值staticvoidShowWelcome(){Console.WriteLine(欢迎来到委托的世界);}// 该方法签名与 IntParamDelegate 一致一个int参数无返回值staticvoidCheckInvestment(intmoney){if(money500)Console.WriteLine(允许加盟);elseConsole.WriteLine(条件不满足);}staticvoidMain(string[]args){// 直接调用方法ShowWelcome();// 使用委托来代理方法NoParamDelegatedel1newNoParamDelegate(ShowWelcome);del1();// 与 ShowWelcome() 等价IntParamDelegatedel2newIntParamDelegate(CheckInvestment);del2(1000);// 与 CheckInvestment(1000) 等价}}}委托就是一个“方法的指针”就像你用变量保存一个数字int a 5委托让你保存一个方法然后像调用方法一样去调用它。del1里存的是ShowWelcome这个方法调用del1()就相当于调用ShowWelcome()。规则委托的签名参数个数、类型、返回值必须和它指向的方法完全一致。2.委托的作用1.把方法当作参数传递你可以把一个方法传给另一个方法让后者决定何时调用。2.实现回调比如按钮点击后系统自动调用你写的方法这就是事件本质是委托。3.解耦代码你不需要在代码里写一堆if-else而是把不同的行为存成委托需要时直接调用。可以将一个包含代码实现和使用时机的方法解耦为,把方法当作变量传递(即委托)给另一个方法一个只负责判断什么时候调用一个只负责代码对的实现互不打扰// 定义一个委托类型delegatevoidMyDelegate(stringmessage);// 一个负责“实现”的方法voidSayHello(stringname)Console.WriteLine($你好{name});// 一个负责“调用时机”的方法voidExecuteAtMidnight(MyDelegateaction){if(DateTime.Now.Hour0)action(世界);// 到点了才真正调用}// 使用把实现绑定到委托然后传给调用者MyDelegatedSayHello;ExecuteAtMidnight(d);3.系统预定义的委托Action 和 FuncAction指向没有返回值的方法可以有0~16个参数。Action → 无参无返回值Action → 一个int参数无返回值Actionstring, int → 两个参数无返回值Func指向有返回值的方法。Func → 无参返回intFuncint, bool → 一个int参数返回bool里最后的类型是返回类型其他的都为参数类型delegateintMathOperation(inta,intb);//声明委托staticintAdd(inta,intb)ab;//方法staticvoidMain(string[]args){MathOperationopt1Add;}staticvoidMain(string[]args){Funcint,int,intMathOperation1Add;//有两个int参数和int返回值}两者等价Func是系统已经声明好的可以直接拿来用4.匿名方法和Lambda表达式staticintAdd(inta,intb)ab;//方法staticvoidMain(string[]args){Funcint,int,intMathOperation1Add;//有两个int参数和int返回值}//匿名方法staticvoidMain(string[]args){// 方法的两个参数 返回值 具体代码Funcint,int,intMathOperation1delegate(inta,intb){returnab};}//Lambda表达式staticvoidMain(string[]args){//编译器会根据你声明的委托类型比如 Funcint, int, int//来自动推断 Lambda 表达式中参数的类型。Funcint,int,intMathOperation1(a,b)ab;}匿名方法顾名思义就是省略方法的名字直接在委托赋值时写具体的代码实现包括了参数和返回值 不需要另外定义方法Lambda表达式要比匿名方法更简洁5.多播委托voidHello()Console.Write(Hello );voidWorld()Console.Write(World);voidExclamation()Console.Write(!);staticvoidMain(string[]args){Actiona1Hello;Actiona2World;Actiona3Exclamation;a1();a2();a3();//输出: Hello World!}staticvoidMain(string[]args){Actiona1Hello;a1World;a1Exclamation;a1();//输出相同//移除方法a1-World;a1-Exclamation;a1();//输出Hello}多播委托指的是一个委托实例可以同时引用多个方法。当你调用这个委托时它会按照方法被添加的顺序依次执行每一个方法。返回值仅保留最后一个方法的返回值。异常影响如果其中一个方法抛出异常后续方法将不会执行。如需独立处理每个方法可以使用GetInvocationList()逐个调用并捕获异常。6.委托与事件事件是 C# 中基于委托实现的特殊成员。通过event关键字我们可以定义一个事件外部只能通过和-添加或移除处理方法而不能直接触发事件只能在声明事件的类内部触发。publicclassButton{// 声明一个事件类型是 ActionpubliceventActionOnClick;publicvoidClick(){// 触发事件调用所有注册的方法OnClick?.Invoke();}}// 使用ButtonbtnnewButton();btn.OnClick()Console.WriteLine(按钮被点击了);btn.Click();// 输出按钮被点击了事件是对委托的进一步封装让代码更加安全、符合面向对象的设计原则