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