将Action上的本地函数用作输入参数

时间:2017-10-12 03:52:27

标签: c# c#-7.0

我有一个接受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");
}

2 个答案:

答案 0 :(得分:6)

将代码带到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时,会创建一个新的闭包类实例并创建新的Action个委托对于lambda和local函数。因此,结果代码对于两者都是相同的。

因此,考虑到你在这里使用它们的方式,它只是归结为可读性(正如许多R#建议所做的那样)。本地函数可以说有更好的语法,所以R#建议你这样使用它。

答案 1 :(得分:-1)

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

查看documentation了解本地功能的所有信息。