면접에서 자주 묻는 질문인데, 커미션과 이벤트의 연관성과 차이점은 무엇인가요? 이전에는 완전히 이해한 적이 없으므로 아래에 요약하겠습니다.
흥미로운 요구사항부터 시작하세요. 고양이, 쥐, 주인 세 명의 캐릭터가 있습니다. 고양이가 울면 쥐는 도망가기 시작하고 주인은 잠에서 깨어납니다.
다음 코드:
1 namespace ConsoleApplication4 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 Cat cat = new Cat("猫"); 8 Mouse mouse1 = new Mouse("老鼠", cat); 9 Master master = new Master("张三", cat);10 //猫叫,通知所有订阅者11 cat.CatCry();12 13 Console.ReadKey();14 }15 }16 17 #region 猫18 public class Cat19 {20 private string name;21 22 //声明事件23 public event EventHandler<CatCryEventArgs> CatCryEvent;24 25 public Cat(string name)26 {27 this.name = name;28 }29 30 public void CatCry()31 {32 //声明事件参数33 CatCryEventArgs args = new CatCryEventArgs(name);34 Console.WriteLine(args);35 36 //触发事件37 CatCryEvent(this, args);38 }39 }40 41 /// <summary>42 /// 事件参数43 /// </summary>44 public class CatCryEventArgs : EventArgs45 {46 private string catName;47 48 public CatCryEventArgs(string catName)49 : base()50 {51 this.catName = catName;52 }53 54 public override string ToString()55 {56 return string.Format("{0}叫了", catName);57 }58 }59 #endregion60 61 #region 老鼠62 public class Mouse63 {64 private string name;65 public Mouse(string name, Cat cat)66 {67 this.name = name;68 cat.CatCryEvent += CatCryEventHandler;//本质上就是往委托链中添加一个方法69 }70 71 //事件处理程序72 private void CatCryEventHandler(object sender, CatCryEventArgs e)73 {74 Console.WriteLine("{0}逃走了:我勒个去,赶紧跑啊!", name);75 }76 }77 #endregion78 79 #region 主人80 public class Master81 {82 private string name;83 public Master(string name, Cat cat)84 {85 this.name = name;86 cat.CatCryEvent += CatCryEventHandler;//本质上就是往委托链中添加一个方法87 }88 89 //事件处理程序90 private void CatCryEventHandler(object sender, CatCryEventArgs e)91 {92 Console.WriteLine("{0}醒了:我勒个去,叫个锤子!", name);93 }94 }95 #endregion96 97 }
데모를 통해 요약할 수 있습니다.
1 이벤트를 정의하고 사용하는 과정은 다음과 같습니다.
2. 이벤트 매개변수를 정의하려면 이벤트를 정의하려면 public event EventHandler
3을 사용하세요. 이벤트는 게시, 구독 및 알림과 함께 관찰자 패턴을 사용합니다. 이를 구현하기 위한 본질은 다음과 같습니다.
1 namespace ConsoleApplication5 2 { 3 //声明委托 4 public delegate void Del1(); 5 6 class Program 7 { 8 static void Main(string[] args) 9 {10 //创建委托链(链式委托)11 Del1 del1 = () => Console.WriteLine("猫叫了");12 del1 += () => Console.WriteLine("老鼠逃走了:我勒个去,赶紧跑啊!");13 del1 += () => Console.WriteLine("主人醒了:我勒个去,叫个锤子!");14 15 //调用委托16 del1();17 18 Console.ReadKey();19 }20 21 }22 }
실제로는 연결된 위임 호출임을 알 수 있습니다. 호출 시 순서대로 실행되는 세 가지 메서드가 체인 대리자에 추가됩니다.
이벤트와 대리자의 관계를 완전히 이해하기 위해 아래와 같이 EventHandler의 소스 코드를 살펴보겠습니다.
위 사진에 빨간색 표시 보이시죠? 따라서 이벤트는 위임을 기반으로 구현됩니다. 요약:
연락처:
1. 이벤트는 위임을 기반으로 구현되며 다음과 같이 널리 이해됩니다. 이벤트는 특별한 종류의 위임입니다. 소스 및 이벤트 매개변수) 반환 값이 없는 대리자입니다.
2, 이벤트 구독자가 이벤트를 구독하면 기본적으로 위임 체인에 이벤트 처리 메서드가 추가됩니다. 이벤트가 트리거되면 위임 체인의 모든 이벤트 처리 메서드가 호출됩니다. .
차이:
대리자의 본질은 사용자 정의 유형(클래스)인 반면, 이벤트의 본질은 특수 대리자 인스턴스(객체)입니다.
위 내용은 위임과 행사의 연관성과 차이점을 정리의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!