C#委托与事件

一、委托与Lambda表达式
如果我的委托类型返回值是void 参数列表为空,但是我想调用的方法是返回值是string 参数列表不为空。
如:
public delegate void stopMachine();//委托
要调用如下方法:
public void shutLight(int a) {......}.//有参数
第一适配器的方式 让委托指向closeLight方法。

 public void closeLight() { shutLight(); };
     stopmachine +=light.closeLight;   

第二种使用lambda表达式:
stopmachine += (() => { light.shutLight(3); });此时的lambda表达式相当于无参的匿名函数。lamdba的用法参考如下:
在这里插入图片描述
Lambda表达式的示例:

 x = x * x
public class Program{
     delegate int TestLambda(int a);
     private static void Main(string[] args){
         TestLambda t1;
         t1 = x => x * X;
         int result = t1(10);
         Console.WriteLine(result);
         Console.ReadKey();
     }
 }

运行结果:
在这里插入图片描述
二、委托与事件

    //定义一个电视机类
    public class TV{ 
       //定义一个关闭电视机的方法
        public void shutTV()
        {
            Console.WriteLine("关闭电视机");
        }
    }
    //定义一个电脑类
    public class Computer{ 
        //关闭电脑
        public void shutComputer()
        { 
           Console.WriteLine("关闭电脑");
        }
    }
    //定义一个电灯类
    public class Light{ 
       //关闭电灯
        public void shutLight(){
            Console.WriteLine("关闭电灯");
        }
    }



    定义控制类:
    public class Controller{
        //定义字段
        private TV tv;
        private Computer computer;
        private Light light;
        //属性get,set
        public TV TV { get; set; }
        public Computer Computer { get; set; }
        public Light Light { get; set; }
        //构造函数
        public Controller() { }
        //定义委托类型stopMachine ,返回值为Void, stopMachine()的参数列表为空。
        //所以要求委托指向的方法返回值也为空,参数列表也为空。
        //delegate关键字相当于类类型的class关键字
        public delegate void stopMachine();
        //声明事件,事件的类型名称是委托的类型名称 如:stopMachine
        //事件在委托的基础上做了封装,事件的调用只能在类的里面
        public event stopMachine stopMachineEvent;
        public void shutDownEvent(){
            if (stopMachineEvent != null)
            {
                this.stopMachineEvent();
            }
        }
}

    在main函数中调用:
    public class Program{
        private static void Main(string[] args){
            //实例化类
            Controller controller = new Controller();
            TV tv = new TV();
            Computer computer = new Computer();
            Light light = new Light();
            //事件实例化
            controller.stopMachineEvent += tv.shutTV;
            controller.stopMachineEvent += computer.shutComputer;
            controller.stopMachineEvent += light.shutLight;
            //调用shutDownEvent方法 让类自己调用stopMachineEvent事件
            controller.shutDownEvent();
            Console.ReadKey();
        }
    }

运行结果图:
在这里插入图片描述
事件的调用只能是在定义事件类的内部,委托打破了封装。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值