【问题标题】:How to attach functions together in C#?如何在 C# 中将函数附加在一起?
【发布时间】:2020-10-04 09:31:51
【问题描述】:

我很难理解这段代码:

public IObservable<SomeInfo> OriginalFunction() => FirstFunction().SecondFunction(argument1).ThirdFunction(argument2);

首先,我不明白IObservable&lt;CarsInfo&gt; 是什么意思。这个函数是否返回一个 observable?

那么,lambda =&gt; 做了什么?

最后,这三个函数是如何使用点相互连接的?

【问题讨论】:

  • First 返回调用 Second 的结果,返回调用 Third 的结果,返回 IObservable=&gt; 只是语法糖。
  • 对于链接部分,请查看 Builder 模式
  • =&gt; 表示方法内部的代码,但在 lambda 中。而IObserable&lt;CarsInfo&gt; 通常应该是通用接口
  • @Muaath - “通常它应该是通用接口”是什么意思?
  • @Enigmativity - 我的意思是:有传统:任何以大写开头的类型 I 意味着它是一个接口,而不是类或枚举。并且任何类型包含&lt;&gt; 表示它是通用的

标签: c# lambda observable


【解决方案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!
}

顺便说一句,期望 argument1argument2 作为类字段或属性,有些人会认为它们“不那么干净”*。

* 我应该详细说明一下:虽然干净的代码提倡使用尽可能少的参数,但在这里使用类字段或属性确实会使函数更难测试。我个人认为这是一种应该避免的副作用。我说的副作用是什么意思?根据类字段的值,两次调用此函数可能会返回不同的结果。 可能是否合理。取决于代码的实际语义,这在示例中根本不清楚。

所以,TL;DR:考虑使用类字段是否合理,或者使用两个参数或使用“选项模式”参数是否更合理。考虑:是否清楚预期的结果(“不要让客户感到惊讶”)?功能是否可测试?还有一些...


编辑:

=&gt; 是 C# 6.0 中添加的一个功能:Expression-bodied function members

您编写的许多成员都是可以是单个表达式的单个语句。改为写一个表达式体成员。它适用于方法和只读属性。例如,覆盖 ToString() 通常是一个很好的选择:
public override string ToString() =&gt; $"{LastName}, {FirstName}";

【讨论】:

  • 非常感谢。最后一个问题:我尝试将 => 替换为大括号,但现在出现“并非所有代码路径都返回值”错误。
  • @coyob49 我相信这是来自 c# 8 的另一种语法糖。它与方法返回相同,只是语法更短。所以,MyMethod{ return 1;}MyMethod =&gt; 1; 是等价的。这就是为什么当你用 curly 替换 =&gt; 时,你必须添加一个 return
猜你喜欢
  • 2021-10-15
  • 1970-01-01
  • 1970-01-01
  • 2011-09-03
  • 2012-01-03
  • 2021-10-07
  • 1970-01-01
  • 2015-06-06
相关资源
最近更新 更多