Оголошення делегата і використання методів розширення в Visual C # (Sharp)

Делега т обявляетс я в першо їрядків екоду:

public delegate void ProcessValue(int value)

ОГОЛОШЕННЯ е делегат а находітс я вн е област і бачимо і клас а мул і інтерфейсу, н про делега т матиме однаковий н іспользоватьс я в контекст е класу Поетом у в т о брешемо я ка до

для оголошення делегата не потрібно навколишній тип, то для його реалізації потрібно

Типом делегата є ідентифікатор методу, яким у нашому випадку виста ProcessValue Делегат буде використаний в прикладі для надання оего механізму зворотних викликів в ітератори Ітератор оголошується Слідуючи чином:

public static class Extensions {

public static void Iterate(this IList&ltint&gt collection,

ProcessValue cb) { foreach (int element in collection) {

cb(element)

}

}

}

Статичний клас Extensions має статичний метод Як було пояснено в чолі 4, Це означає, що для даного класу ніколи не можна створювати примірниках, а виклик методу iterate *) виконується наступним способом:

ExtensionsIterate(..)

У першому параметрі методу iterate *) передається список для обробки в циклі, а в другому – примірник делегата Зверніть увагу на те, що перший параметр оголошений з ключовим словом this Уявіть, що метод оголошений без іспользанія цього ключового слова і використовується як статичний метод Зухвала структура буде виглядати таким чином:

IList&ltint&gt collection  ProcessValue cb ExtensionsIterate(collection, cb)

Цей код кілька незграбний, т к в ньому ясно мається на увазі необхідність знати про існування методу, обробного список Було б краще, якби могли спочатку оголосити список, а потім використовувати IntelliSense, щоб дізнатися, чи є даний метод У С # версії 30 це можливо за допомогою методів розширення,які дозволяють розробнику створювати методи, асоційовані з класами, іншими, ніж ті, в яких вони були оголошені У контексті поточного прикладу методи розширення дозволяють написати наступний код:

IList&ltint&gt collection ProcessValue cb collectionIterate(cb)

Метод iterate () здається розширенням IList, при цьому модифікувати IList не потрібно Методи розширення оголошуються за допомогою оголошення статическо класу зі статичним методом, першому параметру якого передує ключове слово this Цей параметр не потрібно у виклику методу, але представляє тип, який потрібно розширити

ПРИМІТКА

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

. NET, таких як int, double або IList, або якщо зміна типів зажадало б занадто багато зусиль і часу Методи розширення застосовуються тільки заради функціональності, повторно використовуваної по всьому коду Їх можна було застосувати в одному або двох випадках, але в довгостроковому плані це може виявитися проблемічним з причини можливих перекриттів чи конфліктів

У реалізації методу iterate *) кожен елемент колекції обробляється в ціє foreach, в якому змінна cb викликається, як ніби вона була методом Виклик змінної cb відокремлює итератор від обробки ітерації циклу Уявіть собі метод для обчислення поточної загальної суми або максимального значення декількох значень Для обробки в циклі елементів нам потрібно було б визом методу створити екземпляр делегата і викликати метод iterate *) наступним чином:

1stIterate(new ProcessValue(ProcessRunningTotal))

1st Iterate (new ProcessValue (ProcessMaximumValue)) ,-

Таким чином, за допомогою методу розширення та делегата ми створили компактне і просте спільне рішення Для автоматичної ітерації коду необхідно предтавіть тільки реалізацію делегата

Джерело: Гросс К С # 2008: Пер з англ – СПб: БХВ-Петербург, 2009 – 576 е: ил – (Самовчитель)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*