我应该使用 Func<T> 代替私有方法吗?

Posted

技术标签:

【中文标题】我应该使用 Func<T> 代替私有方法吗?【英文标题】:Should I use Func<T> in place of a private method? 【发布时间】:2012-04-21 07:22:09 【问题描述】:

我在这里发布它而不是代码审查,因为我想知道执行程序是否会因此而表现不同(可能是一些微妙的东西)。

是私有方法:

    private int Foo()
    
        return Bar().Bat();
    

与私有 Func 有何不同?

    private Func<int> Foo = () => Bar().Bat();

我这样做的唯一原因是让代码更紧凑。

【问题讨论】:

我认为这种增加的复杂性没有任何好处。实际上,您正在减慢代码以节省三行代码,而您所要做的就是将方法主体写在一行上。 private int Foo() return Bar().Foo(); 我只是想知道它是否表现不同,我还没有决定好处 【参考方案1】:

差别不大,但是

您定义了模板类型 int(可能是类型安全的,即使它在提供的当前代码中不可见)

您可以像使用参数一样使用该函数来传递给另一个函数,当然,您也可以在第一种情况下这样做,但在第一种情况下,您需要声明 delegate 类型。

第三个更紧凑,但第一个更可读,imo,所以如果你不需要一些“功能性”的东西,我会选择第一选择。

【讨论】:

@AaronAnodide: :) 我刚刚编辑了我的帖子。这取决于,我喜欢它的紧凑性,但 imo,它的可读性比第一个略低。 您也可以将命名函数作为参数...取决于参数类型。无需声明委托。 Second 适合在“函数式”编程中使用(尽可能在C# 中使用)。 方法可以通过适当的参数隐式转换为 Func。拥有一个作为参数 Func 的方法足以让它接受 this.Foo【参考方案2】:

Funcs 是 delegates 并封装了任何具有等号 og Func 的方法。对于分层,我建议您使用Private Methods

【讨论】:

【参考方案3】:

使用 Func,您实际上是在保存对匿名方法的引用。编译器从中创建一个命名方法,而您所做的就像保存对它的额外引用。

这没什么大不了的,没有太大区别,除了标准是命名方法。它也更具逻辑性和可读性。

【讨论】:

以上是关于我应该使用 Func<T> 代替私有方法吗?的主要内容,如果未能解决你的问题,请参考以下文章

C#如何将T的动作转换为T的任务的等待函数

使用 T 类型的反射为具有属性的属性创建 Expression<Func<T, TValue>>

将 .net Func<T> 转换为 .net Expression<Func<T>>

没有参数的 Func<T>

如何使用 AutoMock 模拟 Func<T> 工厂依赖项以返回不同的对象?

接受 Expression<Func<T>> 表达式作为参数的扩展方法