Лямбда-вирази в Visual C # (Sharp)

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

public static class Extensions {

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

Func&ltint, bool&gt lambda) {

foreach (int element in collection) { lambda(element)

}

}

}

static class Tests {

static void DoRunningTotalAndMaximum() { List&ltint&gt 1st = new List&ltint&gt { 1, 2, 3, 4 } int runningTotal = 0

1stIterate(

(value) =&gt { runningTotal += value return true

&gt)

ConsoleWriteLine(&quotRunning total is (&quot + runningTotal + &quot)&quot)

int maxValue = intMinValue 1stIterate(

(value) =&gt {

if (value &gt marfValue) { maxValue = value

}

return true

})

ConsoleWriteLine(&quotMaximum value is (&quot + maxValue + &quot)&quot)

}

public static void RunAll() { DoRunningTotalAndMaximum()

}

}

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

Funccint, bool&gt MyMethod

Тут оголошується метод з параметром int і повертається значенням типу bool

Даний метод виглядає таким чином:

bool MyMethod(int value) { return false }

Інтерфейс API NET дозволяє визначати однаковим чином методи, принавши до пяти параметрів Якби нам був потрібен метод з пятьма параметрами, то певний метод мав би шість загальних параметрів NET – Останній паметр вказував би тип повертається методом значення:

Funccint, int, bool, int, int, bool&gt FiveArgs

А якби нам був потрібен метод зовсім без параметрів, то певний метод мав би один загальний параметр NET, який вказує тип повертається методом значення:

Func&ltbool&gt NoArgs

Оголошувати ідентифікатор делегата не обовязково, т к, використовуючи узагальнення

. NET та оголошення делегатів, можна визначити будь-яку необхідну комбінацію оголошень методів Єдиним неможливим оголошенням методу є метод делегата без параметрів і без повертається типу

ПРИМІТКА

Щоб визначити Func () без повертається типу, потрібно визначити явний делат, наприклад void Func () Але лямбда-вирази можна продовжувати використовувати, т к компілятор С # підлаштується під ситуацію і підбере відповідний код

Тепер подивимося на лямбда-вираз в коді, що замінив анонімний метод, який реалізує сигнатуру делегата, що складається з параметра int і повертаються типу bool

(value) =&gt { runningTotal += value return true

})

У лямбда-вираженні відсутня ключове слово delegate або ідентифікатор делегата У ключовому слові і ідентифікаторі немає потреби з тієї причини, що вони маються на увазі, т к лямбда-вираз є анонімним методом Паметри лямбда-вирази визначаються в круглих дужках, але їх тип не вказано Інформація про тип параметрів не потрібно з тієї причини, що вона поазумевается на основі оголошення методу iterate *) Ми знаємо, що значення параметра має тип int, т к в іншому випадку метод iterate про НЕ скомпіловался б

Символи => відокремлюють оголошення параметра від реалізації методу Хоча в примі застосовуються круглі та фігурні дужки, лямбда-вирази можна оголошувати без дужок У такому випадку символи => неявно вказують, що далі слідує виреніе Фігурні дужки, як і в інших типах вихідного коли С #, мають на увазі блок виконуваного коду

Давайте ще раз подивимося на ідентичний анонімний метод:

new ProcessValue* delegate(int value) {

runningTotal += value

}

)

Анонімної метод, за його ключовим словом new, змінної ProcessValue і ідеіфікатором delegate, має досить багатослівний синтаксис, яка не давлять нічого насправді значимого Особисто я при реалізації анонімних методів постійно вважаю дужки, щоб їх було правильне кількість Порівняйте це з компактним і легко читаним лямбда-виразом Перевага пледнего очевидно

Джерело: Гросс К С # 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>

*

*