Проблемы с привязкой подписчиков к делегату

#c#

Вопрос:

Когда я читал о делегатах. Я решил написать простой пример в виде консольного приложения, которое могло бы имитировать действия кнопок.

Поэтому я создаю делегата и пытаюсь подписаться на два метода(OnSomethingHappened_1 и OnSomethingHappened_2) в myButtonObj.Щелкните событие. Ниже показано, что я делал до сих пор:

 using System;  namespace DelegateConsoleExample {  public delegate void MyEventHandler(string foo);   class Program  {  public void Main(string[] args)  {  MyButton myButtonObj = new MyButton();   myButtonObj.Click  = new MyEventHandler(OnSomethingHappened_1);  myButtonObj.Click  = new MyEventHandler(OnSomethingHappened_2);  }   public static void OnSomethingHappened_1(string bar)  {  Console.WriteLine("x method runs");  Console.ReadKey();  }   public static void OnSomethingHappened_2(string bar)  {  Console.WriteLine("y method runs");  Console.ReadKey();  }  }   public class MyButton  {  MyEventHandler myField;   public event MyEventHandler Click  {  add { myField  = value; }  remove { myField -= value; }  }  } }  

Но я не мог понять, где я делаю неправильно, так как я не могу вызвать событие с помощью myButtonObj.Нажмите(«фу»);

Ответ №1:

Во-первых, когда вы определяете делегат как событие, вы можете вызывать его только изнутри самого класса. Во-вторых, когда вы явно определяете добавление/удаление для события, вы должны использовать поле резервного копирования для его вызова. Так что вы можете сделать это, чтобы назвать это:

 public class MyButton {  MyEventHandler myField;   public event MyEventHandler Click  {  add { myField  = value; }  remove { myField -= value; }  }   public void Invoke(string s)  {  myField(s);  } }  //and then calling it like this: myButtonObj.Invoke("foo");  

Комментарии:

1. Но срабатывает только OnSomethingHappened_1

2. О, это потому, что мне нужно было удалить консоль. ReadKey(); Теперь работает нормально

3. @GNZ Рад, что у тебя все получилось. Пожалуйста, отметьте мой ответ, как принятый тогда.