Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Основне використання делегатів у C# - обробка подій.

Поиск

Багато класів стандартної бібліотеки.Net Framework використовують делегати для повідомлення про події, що сталися в них. Відповідно, розробники середовища.NET визнали, що буде доцільно ввести загальний стандартний тип делегат, який використовуватиметься у всій бібліотеці. Його прототип представлений нижче.

 

public delegate void EventHandler( // Посилання на об'єкт, що викликав подію. object sender // Параметри, що описують подію. EventArgs e );

 

Цей делегат приймає всього лише два параметри, що явно замало для універсального делегата. Але все таки виявляється, цих параметрів вистачає для передачі будь-якої інформації. Сам по собі клас EventArgs не містить жодного члена, здатного передавати яку б то не було інформацію. Він введений лише для узагальнення. Коли необхідно передати додаткову інформацію, вводиться новий клас, похідний від EventArgs, в якому вже і вводяться поля, які передають необхідну інформацію. У одній загальній бібліотеці у класу EventArgs 100 нащадків, і їх кількість від версії до версії середовища виконання неухильно зростає.

При зверненні до події, що має тип даного делегата, як параметр необхідно передати посилання на поточний об'єкт (this), а в другому параметрі екземпляр класу EventArgs або похідного від нього.

 

SomeEvent(this, EventArgs.Empty);

 

де властивість Empty просто повертає порожній екземпляр типу EventArgs. В принципі, його можна створити і самому скориставшись оператором new.

 

SomeEvent(this, new EventArgs());

 

Приклад

Програма для генерації варіантів тестів. Використовуються стандартые делегати.

 

 

Одні і ті самі дії можна виконати при натисненні кнопки, вибором пункту меню або кнопки панелі інструментів. Наприклад, генерація варіантів (програмна кнопка).

 

private void btmGentest_Click(object sender, EventArgs e)

{

//кнопка Button – фрагмент коди

DateTime Date; //дата з календаря у форматі DateTime

//Знімаємо дані з полів форми

string Disc = txtDisc.Text; //Дисциплина

string Teacher = comboBox1.Text; //Преподаватель

try

{

if (Disc.Length == 0)

{

throw new Exception("Введіть назву дисципліни");

}

if (Teacher.Length == 0)

{

throw new Exception("Введіть прізвище викладача");

}

Date = monthCalendar1.SelectionRange.Start; //дата, вибрана на календарі. За умовчанням, поточна дата

string strDate = Date.ToString(); //преобразование дати в рядок

int numberVariant = (int)numericUpDown1.Value; //к-во варіантів завдань.

 

}

--------------------------- ----------------------------------

private void toolStripButton1_Click(object sender, EventArgs e)

{

//кнопка панелі інструментів Генерувати - делегат події btmGentest_Click

btmGentest_Click(this, new EventArgs());

}

--------- ------------------- ------------------------------

 

private void генеруватиToolStripMenuItem1_Click(object sender, EventArgs e)

{

//меню Генеруваті

//кнопка генерації - делегат події btmGentest_Click

btmGentest_Click(this, new EventArgs());

}

 

Лямбда-вирази і лямбда-функції

Функціональне програмування базується на лямбда численні, яке запропоноване Алонзо Черчем.

Вікипедія дає таке визначення:

Лямбда-числення (исчисление, лямбда-числення) — формальна система, розроблена американським математиком Алонзо Черчем, для формалізації і аналізу поняття обчислюваності.

лямбда-числення може розглядатися як сімейство прототипних мов програмування. Їх основна особливість полягає в тому, що вони є мовами вищих порядків. Тим самим забезпечується систематичний підхід до дослідження операторів, аргументами яких можуть бути інші оператори, а значенням також може бути оператор. Мови в цьому сімействі є функціональними, оскільки вони базуються на уявленні про функцію або оператор, включаючи функціональну аплікацію і функціональну абстракцію.

 

Базисом функціонального програмування є лямбда вирази і анонімні функції.



Поделиться:


Последнее изменение этой страницы: 2017-02-21; просмотров: 327; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.116.27.225 (0.008 с.)