什么是委托?什么是事件?事件与委托的区别?
什么是委托?
委托是种:引⽤⽅法的对象。此对象可以将指针指向引⽤的⽅法,也可以说对象(委托)将消息发给订阅者(⽅法)
什么是事件?事件与委托的区别?
事件是种:特殊的委托
区别:事件是解决委托的两个缺陷
1、不⼩⼼取消掉订阅者 (封装订阅)
委托允许使⽤ +=和= 两种运算符,就会导致不⼩⼼取消掉订阅者,⽽事件不允许使⽤=
2、包容类外也可以(发布)通知 (封装发布)
事件确保只有包容类才能触发⼀个事件通知 [不允许类的外部执⾏事件通知] (事件只能在定义的类中调⽤(发布))
换⾔之,事件提供了必要的封装来防⽌任何外部类发布⼀个事件或者取消之前的订阅者。这样,就完美的解决了普通委托存在的两个问题PS:  参考《C#本质论》
事件就是要解决下列代码中:+=和= ,在外部类中发布委托的问题
public class Cooler
{
public Cooler(int temperature)
{
this.Temperature = temperature;
}
public int Temperature { get; set; }
public void OnTemperaTureChanged(int tem)
{
if (tem > Temperature)
{
Console.WriteLine($"Cooler On");
}
else
{
Console.WriteLine($"Cooler Off");
}
}
}
public class Heater
{
public Heater(int temperature)
{
this.Temperature = temperature;
}
public int Temperature { get; set; }
public void OnTemperaTureChanged(int tem)
{
if (tem < Temperature)
{
Console.WriteLine($"Heater On");
}
else
{
Console.WriteLine($"Heater Off");
}
}
}
class委托or事件
{
//声明委托
// public delegate string delegateHandle(object sender, HandleEventArgs args);
/
///声明事件
//public event delegateHandle eventHandle;writeline方法属于类
////已发事件的⽅法
//public void Method(HandleEventArgs args)
//{
//    if (eventHandle != null)
//    {
//        eventHandle(this, args);
//    }
//}
public delegate void delegateHandle(int tem);
private delegateHandle _OndelegateHandleChanged;
public delegateHandle OndelegateHandleChanged
{
get { return _OndelegateHandleChanged; }
set { _OndelegateHandleChanged = value;  }
}
private int temperature;
public int Temperature
{
get { return temperature; }
set { temperature = value; if(OndelegateHandleChanged!=null)OndelegateHandleChanged(value); }        }
}
static void Main(string[] args)
{
委托or事件 or = new委托or事件();
Cooler cooler = new Cooler(80);
Heater heater = new Heater(60);
//or.eventHandle += Or_eventHandle;
//or.Method(handler);
or.OndelegateHandleChanged += cooler.OnTemperaTureChanged;
or.OndelegateHandleChanged += heater.OnTemperaTureChanged;
or.OndelegateHandleChanged = heater.OnTemperaTureChanged;
or.OndelegateHandleChanged(45);
Console.ReadLine();
}
View Code

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。