当前位置: 首页 > article >正文

c#的委托、事件

程序目的:实现对一个bool型变量的监视,当数据变化时,调用某一个函数,引申出委托、事件等基础概念。

方法一、在form1的类定义中,定义如下代码,这样定义是最直接的,也非常简单,没有涉及到委托和事件。缺点也很明显,如果有多个这样的变量,共用改变之后的触发函数,则可移植性能要差很多。

public partial class Form1 : Form
{
     
    private bool start=false;   //上位机的启动变量,传递给plc,实验完成后由PLC清0
    //public event Action<bool> StartChanged;                             //public event Action<bool> StartChanged;

    public bool Start
    {
        get { return start; }
        set
        {
            if (start != value)
            {
                start = value;
                OnStartChanged2(start);
            }
        }
    }
    private void OnStartChanged2(bool newStartValue)
    {
        // 这里可以添加更具体的处理逻辑,而不是仅仅输出到控制台
        Console.WriteLine($"Start value changed to: {newStartValue}");
    }
}

方法二、应用委托和事件的方法,代码如下。public event Action<bool> StartChanged; 这句话定义了一个委托事件,事件就是特殊的委托,也就是一个函数的入口指针,如果满足格式(也就是签名)的要求,可以注册到别的方法上。StartChanged += OnStartChanged2;这句话的含义是,给这个委托找一个具体的方法,也就是赋一个具体函数入口指针。

总结:这种方法看着更麻烦了,但是层次更加清晰了,如果有多个bool型变量具有相同的方法,这时候优点就显现出来了。

 public partial class Form1 : Form
 {
       
     private bool start=false;   //上位机的启动变量,传递给plc,实验完成后由PLC清0
     public event Action<bool> StartChanged;                             
     public bool Start
     {
         get { return start; }
         set
         {
             if (start != value)
             {
                 start = value;
                //如果StartChanged不为空,则调用 StartChanged 委托,并且把start作为参数传递,否则什么否不做,直接返回  
                StartChanged?.Invoke(start);          
             }
         }
     }

     private void OnStartChanged2(bool newStartValue)
     {
         // 这里可以添加更具体的处理逻辑,而不是仅仅输出到控制台
         Console.WriteLine($"Start value changed to: {newStartValue}");
     }

     private void Initalize_czl()//测试界面初始化
     {  
         StartChanged += OnStartChanged2;
     }
}

三、多个变量共用该方法,代码如下。这时候起到的作用就是共用了方法,这些暂时还没有引入更多的参数,应该有更好的方法,暂时记录到这里。

    public partial class Form1 : Form
    {
        private bool start1=false;   //上位机的启动变量,传递给plc,实验完成后由PLC清0
        private bool start2 = false;
        private bool start3 = false;
        public event Action<bool> StartChanged;                             //public     
        event Action<bool> StartChanged;

        public bool Start1
        {
            get { return start1; }
            set
            {
                if (start1 != value)
                {
                    start1 = value;
                    StartChanged?.Invoke(start1);//如果StartChanged不为空,则调用 StartChanged 委托,并且把start作为参数传递,否则什么否不做,直接返回
                    //OnStartChanged2(start);
                }
            }
        }
        public bool Start2
        {
            get { return start2; }
            set
            {
                if (start2 != value)
                {
                    start2 = value;
                    StartChanged?.Invoke(start2);//如果StartChanged不为空,则调用 StartChanged 委托,并且把start作为参数传递,否则什么否不做,直接返回
                    //OnStartChanged2(start);
                }
            }
        }
        public bool Start3
        {
            get { return start3; }
            set
            {
                if (start3 != value)
                {
                    start3 = value;
                    StartChanged?.Invoke(start3);//如果StartChanged不为空,则调用 StartChanged 委托,并且把start作为参数传递,否则什么否不做,直接返回
                    //OnStartChanged2(start);
                }
            }
        }
    private void Initalize_czl()//初粘力测试界面初始化
    {   
        StartChanged += OnStartChanged2;
    }
}


http://www.kler.cn/news/310339.html

相关文章:

  • Red Hat 和 Debian Linux 对比
  • 异常(Exception)
  • 24年蓝桥杯及攻防世界赛题-MISC-2
  • LeetCode41. 缺失的第一个正数(2024秋季每日一题 20)
  • OpenHarmony(鸿蒙南向开发)——标准系统方案之扬帆移植案例
  • Qt安卓开发连接手机调试(红米K60为例)
  • 宠物定位技术升级,蓝牙定位让爱宠随时在线
  • 《机器学习by周志华》学习笔记-神经网络-02感知机与多层网络
  • SQL 多表联查
  • DAY60Bellman_ford 算法
  • MatchRFG:引领MemeCoin潮流,探索无限增长潜力
  • 养殖场中的分布式光伏发电
  • python画图|在3D图上画2D直方图(作图平面移动)
  • 828华为云征文|华为Flexus云服务器打造《我的世界》游戏服务器
  • maven pom文件中的变量定义
  • MacOS Safari浏览器按ESC就退出全屏模式的去除办法
  • 机器狗与无人机空地协调技术分析
  • 如何快速解决程序中的BUG
  • LeetCode 每日一题 求出最多标记下标
  • Kubernetes从零到精通(12-Ingress、Gateway API)
  • camtasia2024绿色免费安装包win+mac下载含2024最新激活密钥
  • 662. 二叉树最大宽度 BFS 力扣
  • 层次聚类(Hierarchical Cluster)—无监督学习方法、非概率模型、判别模型、线性模型、非参数化模型、批量学习
  • 【原创 架构设计】多级缓存的应用、常见问题与解决方式
  • 【MATLAB源码-第170期】基于matlab的BP神经网络股票价格预测GUI界面附带详细文档说明。
  • svg与css关联
  • Spring Boot-Bean注入问题
  • JAVA对象、List、Map和JSON之间的相互转换
  • 电脑端视频剪辑软件哪个好用,十多款剪辑软件分享
  • 制造业的智能化革命:工业物联网(IIoT)的优势、层级应用及挑战解析