#c# #lambda #observable
#c# #лямбда #наблюдаемый
Вопрос:
Мне трудно понять этот фрагмент кода:
public IObservable<SomeInfo> OriginalFunction() => FirstFunction().SecondFunction(argument1).ThirdFunction(argument2);
Во-первых, я не понимаю, что это IObservable<CarsInfo>
значит. Возвращает ли эта функция наблюдаемое?
Тогда что делает лямбда =>
?
И, наконец, как три функции связаны друг с другом с помощью точек?
Комментарии:
1. Первая возвращает результат, для которого вызывается вторая, которая возвращает результат, для которого вызывается третья, которая возвращает IObservable<SomeInfo> .
=>
это просто синтаксический сахар.2. Для части цепочки посмотрите на шаблон Builder
3.
=>
означает код внутри метода, но в лямбда. иIObserable<CarsInfo>
обычно это должен быть универсальный интерфейс4. @Muaath — Что означает «обычно это должен быть универсальный интерфейс»?
5. @Enigmativity — я имею в виду: существует традиция: любой тип, начинающийся с заглавной
I
буквы, означает, что это интерфейс, а не класс или перечисление. и любой тип содержит<>
означает, что он общий
Ответ №1:
public IObservable<SomeInfo> OriginalFunction() => FirstFunction().SecondFunction(argument1).ThirdFunction(argument2);
эквивалентно
public IObservable<SomeInfo> OriginalFunction()
{
var firstResult = FirstFunction();
var secondResult = firstResult.SecondFunction(argument1)
return secondResult.ThirdFunction(argument2); // mind the 'return' here!
}
которые, кстати, ожидают argument1
и argument2
как поля или свойства класса, которые некоторые люди сочли бы «не такими чистыми» *.
* Я должен остановиться на этом подробнее: в то время как чистый код выступает за то, чтобы иметь как можно меньшее количество аргументов, использование здесь полей или свойств класса усложняет тестирование функции. Лично я бы счел это своего рода побочным эффектом, которого следует избегать. Что я подразумеваю под побочным эффектом? Два вызова этой функции могут возвращать разные результаты в зависимости от значения полей класса. Это может быть разумным или нет. Зависит от фактической семантики кода, которая совсем не ясна из примера.
Итак, TL; DR: подумайте, разумно ли использовать поля класса или более разумно использовать два аргумента или использовать аргумент «Параметры-шаблон». Примите во внимание: понятно ли, какого результата ожидать («не удивлять клиентов»)? Доступна ли функция для тестирования? И еще кое-что…
Редактировать:
=>
добавлена ли функция в C # 6.0: функциональные члены с выражением
Многие члены, которые вы пишете, представляют собой отдельные операторы, которые могут быть отдельными выражениями. Вместо этого напишите член с выражением. Это работает для методов и свойств, доступных только для чтения. Например, переопределение toString() часто является отличным кандидатом:
public override string ToString() => $"{LastName}, {FirstName}";
Комментарии:
1. Большое вам спасибо. Последний вопрос: я попытался заменить => фигурными скобками, но теперь я получаю ошибку «Не все пути кода возвращают значение».
2. @coyob49 я полагаю, что это еще один синтаксический сахар из c # 8. Это то же самое, что и метод, возвращающий, только более короткий синтаксис. Итак,
MyMethod{ return 1;}
иMyMethod => 1;
эквивалентны. Вот почему, когда вы просто заменяете=>
на curly, вы должны добавитьreturn