假设我有以下类(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 似乎没有给我任何好处(除了执行速度的微弱改进,这可能会或可能不会显着取决于场景),因为我正在做的是执行它,而不是修改它。

最佳答案



是的,你是对的。

通常 expression 当我们想要处理传递给 lambda 表达式的函数体时使用,在正常情况下,我们只需要在内存中对一些已经在内存中的数据执行一个方法 Func 应该是好的去。

在您在问题中引用的帖子中,您可以看到答案突出显示,在 Linq To Sql Entity Framework 中实现某些数据获取逻辑时它很有用,因为它们使用 Expression 检查传入的信息然后翻译它到 SQL 语句。

Mehrdad's answer 引用:



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

希望能帮助到你!

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

10-16 21:14
查看更多