gpt4 book ai didi

c# - 也许 monad 使用表达式树?

转载 作者:太空狗 更新时间:2023-10-29 23:11:01 24 4
gpt4 key购买 nike

丑陋的:

string city = null;
if (myOrder != null && myOrder.Customer != null)
city = myOrder.Customer.City;

更好(maybe monad):

var city = myOrder
.With(x => x.Customer)
.With(x => x.City)

更好?这有什么理由不能写?

var city = Maybe(() => myOrder.Customer.City);

最佳答案

是的,这应该是可能的。但是,正确实现表达式树重写器比表面上看起来要复杂得多。特别是如果您希望能够正确处理字段、属性、索引属性、方法调用和其他在任意表达式中有效的构造。

它也可能不是性能最好的操作,因为要评估表达式,您必须每次都将表达式树动态编译为 lambda 函数。

有一个 implementation on this pattern on CodePlex 。我从来没有亲自使用过它,所以我不能说它的实现有多好,或者它是否可以处理我描述的所有情况。

创建表达式树重写器的替代方法是编写 Maybe()接受 lambda 函数(而不是表达式树)并捕获任何 ArgumentNullException抛出,返回 default(T)在那些情况下。以这种方式使用异常进行流量控制会让很多人误会……但这肯定是一种更容易实现的正确方法。我个人避免使用它,因为它可以掩盖作为表达式的一部分调用的方法中的空引用错误,这是不可取的。

关于c# - 也许 monad 使用表达式树?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4403519/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com