【问题标题】:Using a Local Function over an Action as an input param在动作上使用局部函数作为输入参数
【发布时间】:2017-10-12 03:52:26
【问题描述】:

我有一个接收Action<string> 的方法(参见下面的简单示例),但是在构造Action 的调用方法中,Resharper 建议应该使用本地函数。

关于使用本地函数代替操作的推荐做法是什么,这是否重要,或者有什么需要注意的问题?

public void Caller()
{
    string holder;
    Action<string> act = s => holder = s;
    void SetHolder(string s) => holder = s;

    DoStuff(act);
    DoStuff(SetHolder);
}

public void DoStuff(Action<string> setHolder)
{
    setHolder("holders new string");
}

【问题讨论】:

    标签: c# c#-7.0


    【解决方案1】:

    把你的代码放到sharplab.io,我们可以看到代码降到了:

    public class Class
    {
        [CompilerGenerated]
        private sealed class <>c__DisplayClass0_0
        {
            public string holder;
    
            internal void <Caller>b__0(string s)
            {
                this.holder = s;
            }
    
            internal void <Caller>g__SetHolder1(string s)
            {
                this.holder = s;
            }
        }
    
        public void Caller()
        {
            Class.<>c__DisplayClass0_0 @object = new Class.<>c__DisplayClass0_0();
            Action<string> setHolder = new Action<string>(@object.<Caller>b__0);
            this.DoStuff(setHolder);
            this.DoStuff(new Action<string>(@object.<Caller>g__SetHolder1));
        }
    
        public void DoStuff(Action<string> setHolder)
        {
            setHolder("holders new string");
        }
    }
    

    因为actSetHolder 都是holder 上的闭包,所以当调用Caller 时,会创建一个新的闭包类实例,并为lambda 和本地函数创建新的Action 委托。所以两者的结果代码是相同的。

    因此,鉴于您在此处使用它们的方式,它归结为可读性(正如许多 R# 建议所做的那样)。本地函数可以说具有更好的语法,因此 R# 建议您以这种方式使用它。

    【讨论】:

    • 你的回答让我更加好奇,因为我读过here,如果一个本地函数是静态的,除非它访问this,否则它们是实例方法。我在sharplab.io(直到现在我还不知道sharplab)中创建了一个替代示例(请参阅下一条评论,因为这里的链接太长),它添加了一些null 检查Action 但不是局部函数。你能详细说明一下区别吗?
    • Alternate example 使用等同于 static Action 和本地函数的内容。
    • 我想我点击了为什么会有空检查。 Action 是一个变量,可以为 null,而由于缺少正确的术语,本地函数是一个用于保存语句的语法容器,因此不需要检查它是否为 null,因为它不能本质上是空的。
    【解决方案2】:

    本地函数相对于委托的一个好处是调用它们不会导致委托实例化和委托调用,这在您的示例中丢失了,因为您使用委托包装它以将其传递给DoStuff

    查看documentation 了解所有关于本地函数的信息。

    【讨论】:

      猜你喜欢
      • 2011-02-14
      • 2023-03-24
      • 1970-01-01
      • 2016-01-31
      • 1970-01-01
      • 1970-01-01
      • 2023-01-21
      • 2021-06-12
      • 1970-01-01
      相关资源
      最近更新 更多