static void Main(string[] args) { System.Console.OutputEncoding = System.Text.Encoding.Unicode; System.Console.InputEncoding = System.Text.Encoding.Unicode; // створюємо банківський рахунок Account account = new Account(200); // Додаємо в делегат посилання на метод Show_Message // а сам делегат передається як параметр методу RegisterHandler account.RegisterHandler(new Account.AccountStateHandler(Show_Message)); // Два рази поспіль намагаємося зняти гроші account.WithdrawVer2(100); account.WithdrawVer2(150); // Передати декілька методів для визова account.RegisterHandler(new Account.AccountStateHandler(Show_Message) + new Account.AccountStateHandler(Show_Message)); account.Put(100); // Два рази поспіль намагаємося зняти гроші Console.WriteLine($"\nМаємо два метода в делегаті"); account.WithdrawVer2(100); account.WithdrawVer2(150); // Передати декілька методів для визова VER2 Account accountVer2 = new Account(200); Account.AccountStateHandler colorDelegate = new Account.AccountStateHandler(Color_Message); // Додаємо в делегат посилання на метод accountVer2.RegisterHandlerVer2(new Account.AccountStateHandler(Show_Message)); accountVer2.RegisterHandlerVer2(colorDelegate); Console.WriteLine($"\nМаємо два метода в делегаті Ver2"); // Два рази поспіль намагаємося зняти гроші accountVer2.WithdrawVer2(100); accountVer2.WithdrawVer2(150); // видаляємо делегат accountVer2.UnregisterHandlerVer2(colorDelegate); Console.WriteLine($"\nПісля видалення метода colorDelegate"); accountVer2.WithdrawVer2(50); Console.ReadKey(); }
static void Main(string[] args) { Account account = new Account(200); Account.AccountStateHandler colorDelegate = new Account.AccountStateHandler(Color_Message); // Добавляем в делегат ссылку на методы account.RegisterHandler(new Account.AccountStateHandler(Show_Message)); account.RegisterHandler(colorDelegate); // Два раза подряд пытаемся снять деньги account.Withdraw(100); account.Withdraw(150); // Удаляем делегат account.UnregisterHandler(colorDelegate); account.Withdraw(50); Console.ReadLine(); }
static void exampleColor() { Console.WriteLine("\nПример с цветом"); Account account = new Account(200); Account.AccountStateHandler colorDelegate = new Account.AccountStateHandler(Color_Message); // Добавляем в делегат ссылку на методы account.RegisterHandler(new Account.AccountStateHandler(Show_Message)); account.RegisterHandler(colorDelegate); // Два раза подряд пытаемся снять деньги account.Withdraw(100); account.Withdraw(150); // Удаляем делегат account.UnregisterHandler(colorDelegate); account.Withdraw(50); }
static void Main(string[] args) { // Создадим банковский счёт Account account = new Account(200); Account.AccountStateHandler colorDelegate = new Account.AccountStateHandler(Color_Message); // Добавим в делегат ссылку на метод Show_Message // а сам делегат передаётся в качестве параметра метода RegisterHandker account.RegisterHandler(new Account.AccountStateHandler(Show_message)); account.RegisterHandler(colorDelegate); // Два раза подряд пытаемся снять деньги account.Withdraw(100); account.Withdraw(150); // Удаляем делегат account.UnregisterHandler(colorDelegate); account.Withdraw(50); Console.ReadLine(); }
static void Main(string[] args) { //Примеры функционала делегата - обозначены в комментариях знаком >>> Console.WriteLine("----------------------------------------------------------"); //>>> Функционал делегата - указатель на другой метод //Создаём переменную созданного делегата Message message; if (DateTime.Now.Hour < 10) { message = textHello; } else { message = textByeBye; } //Выполнение метода из списка вызовов делегата message(); Console.WriteLine("----------------------------------------------------------"); //>>> Функционал делегата - делигирование классом выполнения некоторого кода извне //(Определяем дополнительную логику извне для выполнение какого-то дейтсвия внутри другого класса) Account myAccount = new Account(400); Account.AccountStateHandler colorDelegat = new Account.AccountStateHandler(colorMessage); //Для первого метода в списке делегат передаём объект, в котором инициализируем переменую делегата myAccount.registerHandler(new Account.AccountStateHandler(showMessage)); //>>> Функционал делегата - добавление, удаление и поочередное выполнение нескольких методов в списке делегатов //В методе registerHandler() добавляем метод список вызовов делегата myAccount.registerHandler(colorDelegat); myAccount.withdraw(200); myAccount.withdraw(100); //В методе unregisterHandler() удаляем метод из списка вызовов делегата myAccount.unregisterHandler(colorDelegat); myAccount.withdraw(250); Console.WriteLine("----------------------------------------------------------"); //>>> Функционал делегата - выполнение анонимных методов, которые позволяют создавать готовые экземрляры готов делегатов //(Объявление анонимного метода начинается с delegate()) MessageWithText messageWithText = delegate(string text) { Console.WriteLine(text); }; messageWithText("Зупуск анонимный метод!"); Console.WriteLine("----------------------------------------------------------"); //>>> Функционал делегата - использование с лямбда-выражениями, которые являются упрощённой запись анонимных методов Operatin operation = (x, y) => x * y; //Лямбда-выражение для опеределение операции умножение двух чисел Console.WriteLine("Результат умножение двух чисел - {0}", operation(10, 2)); //Интересно - если мы доабвим в список выполнения доп.метод, то результат операций выведетя только для последнего метода operation += (x, y) => x + y; //Лямбда-выражение для опеределения операции сложения двух чисел Console.WriteLine("В списке выполенения делегата несколько методов, но результат только последнего, это сложение - {0}", operation(153, 47)); Console.WriteLine("----------------------------------------------------------"); Console.ReadKey(); }
static void Main() { /* Пример 1 */ Console.WriteLine("Пример 1: "); Message message; // Создаём переменную делегата if (DateTime.Now.Hour < 12) { message = GoodMorning; // Присваиваем этой переменной адрес метода } else { message = GoodEvening; } message(); // Вызываем метод /* Пример 2 */ Console.WriteLine("Пример 2: "); Operation operation = Add; // Указание на метода ADD int result = operation(4, 5); // Add 4 5 Console.WriteLine(result); operation = Multiply; // Указание на метод Multiply result = operation(4, 5); // Multiply 4 5 Console.WriteLine(result); /* Пример 3 */ Console.WriteLine("Пример 3: "); Math math = new Math(); Operation2 operation2 = math.Sum; // указание делегата на другой класс, где он не обьявлен int result2 = operation2(4, 5); Console.WriteLine(result2); /* Пример 4 */ Console.WriteLine("Пример 4: "); message = Hello; // Указываем на метод hello message += HowAreYou; // добавляем к нему метод howareyou message(); // Hello How Are you? в 2 строчки т.к вызываеются оба метода message += Hello; message += Hello; message(); // 3 раза вызывается Hello и один раз HowAreYou message -= HowAreYou; message(); // 3 раза вызывается Hello Message message1 = Hello; Message message2 = HowAreYou; Message message3 = message1 + message2; // Объединение делегатов значит, что в список вызова делегата mes3 попадут все методы из делегатов mes1 и mes2. message3(); /* Пример 5 */ Console.WriteLine("Пример 5: "); Message message4 = Hello; message4.Invoke(); // Другой способ вызова делегатов Operation operation3 = Add; int result3 = operation3.Invoke(3, 4); Console.WriteLine(result3); Message message5 = null; message5?.Invoke(); // При вызове делегата лучше проверять не равен ли он null не то исключение /* Пример 6 * Анонимный метод */ Console.WriteLine("Пример 6: "); MessageHandler handler = delegate(string mes) // Создание анонимного метода delegate ключевое слово { Console.WriteLine(mes); }; handler("Hello World"); ShowMessage("Hello", delegate(string mes) // Другой пример анононимных методов - передача в качестве аргумента для параметра { Console.WriteLine(mes); }); /* Если анонимный метод использует параметры, то они должны соответствовать параметрам делегата. * Если для анонимного метода не требуется параметров, то скобки с параметрами можно опустить * даже если делегет принимает несколько параметров исключение in out*/ MessageHandler handler1 = delegate { Console.WriteLine("Анонимный метод"); }; handler1("Hello world"); /* Так же как и обычное методы, анонимные могут возвращать результат */ Operation operation1 = delegate(int x, int y) { return(x + y); }; int d = operation1(4, 5); Console.WriteLine(d); /* При этом анонимный метод имеет доступ ко всем переменным, определенным во внешнем коде*/ int z = 8; Operation operation4 = delegate(int x, int y) { return(x + y + z); }; int j = operation4(4, 5); Console.WriteLine(j); // 17 /* Упражнение 1 */ Console.WriteLine("Упражение 1: "); Account accout = new Account(200); Account.AccountStateHandler colorDelegate = new Account.AccountStateHandler(Color_Message); /* Добавляем в делегат ссылку на методы */ accout.RegisterHandler(new Account.AccountStateHandler(Show_Message)); accout.RegisterHandler(colorDelegate); /* 2 раза снимаем деньги */ accout.withdraw(100); accout.withdraw(150); /* Удаляем делегат */ accout.UnregisterHandler(colorDelegate); accout.withdraw(50); }