gpt4 book ai didi

c# - 为什么这里要用Expression,为什么不用Function?

转载 作者:行者123 更新时间:2023-11-30 15:55:43 27 4
gpt4 key购买 nike

假设我有以下类(class)...

public class Person {
public string Name { get; set; }
public string Nickname { get; set; }
}

...我希望能够(单独)检查 NameNickname 属性是否以“a”开头。

我可以像这样写两个方法...

public bool NameStartsWithA(Person p) {
return p.Name.ToLower().StartsWith("a");
}

public bool NicknameStartsWithA(Person p) {
return p.Nickname.ToLower().StartsWith("a");
}

但是,这违反了 DRY(在这个人为简单的示例中不是大问题,但在现实世界中可能很重要)。

四处寻找,似乎答案是做以下......

public bool StartsWithA(Person p, Expression<Func<Person, string>> f) {
return f.Compile()(p).ToLower().StartsWith("a");
}

...然后可以如下调用...

bool b = StartsWithA(person, p => p.Name);

这很好用,但我想知道 Expression 的要点是什么。如果我删除它,并使方法看起来像这样...

public bool StartsWithA(Person p, Func<Person, string> f) {
return f(p).ToLower().StartsWith("a");
}

...它似乎也能正常工作。

Expression 有什么意义吗?查看“Why would you use Expression> rather than Func?”,似乎 Expression 在这种情况下没有给我任何好处(除了执行速度的微小改进,这可能会或可能不会显着,具体取决于场景),因为我所做的只是执行它,而不是修改它。

最佳答案

it seems that the Expression doesn't give me any benefit in this case

是的,你是对的。

通常 expression当我们想玩转传递给 lambda 表达式的函数体时使用,在正常情况下,我们只需要对内存中已有的一些数据执行内存中的方法 Func应该可以开始了。

在您在问题中提到的帖子中,您可以看到答案强调它在 Linq To SqlEntity Framework 中实现一些数据获取逻辑时非常有用他们使用 Expression检查传入的信息,然后将其转换为 SQL 语句。

来自 Mehrdad's answer引用:

Conceptually, Expression<Func<T>> is completely different from Func<T>. Func<T> denotes a delegate which is pretty much a pointer to a method and Expression<Func<T>> denotes a tree data structure for a lambda expression. This tree structure describes what a lambda expression does rather than doing the actual thing.

所以很明显这两者有多少不同,这应该让您足够了解何时使用哪个。

希望对您有所帮助!

关于c# - 为什么这里要用Expression,为什么不用Function?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48097913/

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