Що означає вираз лямбда _=> expr?
Яка мета _введення в лямбду?
Приклад:
int count = 0;
list.ForEach(_ => count += 1);
listце IEnumerable<T>, вони можуть (і повинні) тільки що використовувалиsum = list.Count();
Що означає вираз лямбда _=> expr?
Яка мета _введення в лямбду?
Приклад:
int count = 0;
list.ForEach(_ => count += 1);
listце IEnumerable<T>, вони можуть (і повинні) тільки що використовувалиsum = list.Count();
Відповіді:
Це умова, яка використовується, коли вам не байдуже параметр.
_є символом підстановки у відповідності зразком. Це в основному означає "Мені все одно, я завжди хочу, щоб це відповідало". Це "мені байдуже" потім переноситься, коли йдеться про іменування речей, які вас не цікавлять, і звідти воно переливається на інші мови програмування. Наприклад, він також використовується в Ruby для того, щоб означати те саме, що і в цьому прикладі, хоча _він не має особливого значення в Ruby.
Це ім'я параметра, хоч і не корисне, але це правило, яке зазвичай використовується (за деякими умовами), коли вам потрібно вказати, що вираз має параметр для того, щоб отримати компіляцію коду, але вам насправді все одно про це, так що ви просто збираєтесь ігнорувати це.
Це в основному використання синтаксису для того, що становить юридичний ідентифікатор у C #, і оскільки ідентифікатор може починатися з підкреслення і нічого більше не містити, це просто ім'я параметра.
Ви могли просто легко написати:
var _ = 10;
Thread t= new Thread(()=>doSomething(x,y)); t.start();
_- дійсне ім'я змінної. Вони просто використовуються _як змінна.
Я також друге використання _ => _.method()для однорядкових, методів виклику лямбда, оскільки це зменшує пізнавальну вагу інструкції. Спеціально, використовуючи дженерики, написання x => x.method()просто додає роздуму "Що це" х "? Це координата в просторі?".
Розглянемо наступний випадок:
Initialize<Client> ( _=>_.Init() );
Використовується для виклику Generics, підкреслення в цьому випадку працює як "обхідний символ". Це дозволяє уникнути надмірності, визначаючи, що тип аргументу очевидний і його можна заразити від використання - так само, як коли ви використовуєте 'var', щоб запобігти повторенню декларації типу. Писання client=>client.Init()тут просто збільшило б інструкцію, не додаючи їй жодного значення.
Очевидно, це не стосується параметрів, що передаються методу, який повинен бути названий описово. Напр .:Do( id=>Log(id) );
Використання єдиного підкреслення параметрів для викликів методів навряд чи виправдане при використанні блоку коду замість однолінійного, оскільки ідентифікатор лямбда відключається від свого загального визначення. Загалом, коли той самий ідентифікатор потрібно використовувати повторно, дайте йому описову назву.
Суть полягає в тому, що багатослівність виправдана лише для неоднозначностей, особливо для лямбда, які були створені в першу чергу для спрощення створення анонімних делегатів. У будь-якому випадку слід використовувати здоровий глузд, врівноважуючи розбірливість і стислість. Якщо символ є лише «гачком» для реальної функціональності, один ідентифікатор символів ідеально підходить. Так буває з циклами For-циклів та літерами "i" та "j" як індексаторами.
Do(id => Log(id))краще скорочено як Do(Log).