假设我有以下类(class)...
public class Person {
public string Name { get; set; }
public string Nickname { get; set; }
}
...我希望能够(单独)检查
Name
或 Nickname
属性是否以“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
似乎没有给我任何好处(除了执行速度的微弱改进,这可能会或可能不会显着取决于场景),因为我正在做的是执行它,而不是修改它。 最佳答案
是的,你是对的。
通常 expression
当我们想要处理传递给 lambda 表达式的函数体时使用,在正常情况下,我们只需要在内存中对一些已经在内存中的数据执行一个方法 Func
应该是好的去。
在您在问题中引用的帖子中,您可以看到答案突出显示,在 Linq To Sql 或 Entity Framework 中实现某些数据获取逻辑时它很有用,因为它们使用 Expression
检查传入的信息然后翻译它到 SQL 语句。
从 Mehrdad's answer 引用:
所以很明显这两个有多大不同,这应该让你足够了解何时使用哪个。
希望能帮助到你!
关于c# - 为什么在这里使用表达式,为什么不使用 Func?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48097913/