Как объединить функции в C #?

#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