构建器模式、委托和 lambda 表达式 - 需要解释

Posted

技术标签:

【中文标题】构建器模式、委托和 lambda 表达式 - 需要解释【英文标题】:The builder pattern, delegates and lambda expression- need explanation 【发布时间】:2021-12-03 01:09:26 【问题描述】:

我在编程领域并不陌生,但是我需要帮助来理解这段代码中发生了什么。我确实了解构建器模式和 Action delagete(不返回任何内容,但可以接受一些参数)。

下面的代码让我很困扰:

    0. var carBuilder = new CarBuilder().WithDoors(x => x.WithDoors(4)).Build();
    1. public CarBuilder WithDoors(Action<DoorsBuilder> x)
    2. 
    3.    var doorsBuilder = new DoorsBuilder();
    4.    x(doorsBuilder);
    5.    _car.AddDoors(doorsBuilder.Build());
    6.    return this;
    7. 
    第 4 行发生了什么? 我实际上在第 0 行中将什么传递给 WithDoors 函数? 是否可以以更简单的方式重写该代码(以便更好地理解:))?

代码: https://rextester.com/SIOV54215

【问题讨论】:

【参考方案1】:

第 4 行发生了什么?

在第 4 行,代码调用传递在第 3 行创建的 DoorBuilder 的操作委托,在第 5 行,它将使用门构建器构建的门添加到由 CarBuilder 构建的汽车中。这是复合(或嵌套)构建器中使用的相当常见的模式。它看起来很像我多年前对一个问题的回答:Builder pattern with nested objects

我实际上在第 0 行中将什么传递给 WithDoors 函数?

这里有个问题,你的方法命名有些混乱,CarBuilderDoorBuilder 都有一个名为WithDoors 的方法。我会让DoorBuilder 有一个名为NumberOfDoors 的方法,使代码更具可读性,并且更明显地发生了什么:

var car = new CarBuilder().WithDoors(x => x.NumberOfDoors(4)).Build();

(注意变量名的变化;这一行的结果是(构建的)car NOT carBuilder!)

是否可以以更简单的方式重写该代码(以便更好地理解:))?

我想知道这里是否需要嵌套构建器,也许随着它变得更加复杂(例如,设置门的功能,如装饰、电动窗等),但你做对了现在您唯一可以构建的就是可以在CarBuilder 本身制作代码的门的数量:

var car = new CarBuilder().WithDoors(4).Build();

【讨论】:

x.Invoke(doorsBuilder) 是否等同于 x(doorsBuilder)? 看起来 x.NumberOfDoors() 需要 DoorsBuilder 的实例才能执行。 x.NumberOfDoors 当然不会明确地接受它,而是隐含地接受它。换句话说:如果我想执行 x.NumberOfDoors,我需要提供 DoorsBuilder 的实例。我做对了吗? @tylkonachwile 我想是的,是的。 是的,您可以使用Invoke 呼叫代表

以上是关于构建器模式、委托和 lambda 表达式 - 需要解释的主要内容,如果未能解决你的问题,请参考以下文章

个人理解的Lambda表达式的演化过程

C#中的委托,匿名方法和Lambda表达式

如何将 C# lambda 表达式转换为委托?

委托Lambda表达式和事件

Lambda表达式

转载 C#匿名函数 委托和Lambda表达式