使用Action上的Local函数作为输入参数

Ayb*_*btu 5 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");
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*rno 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

因为这两个actSetHolder超过关闭holder,当Caller调用一个新的closure类实例被创建和新Action的Lambda和局部功能都被创建的代表.因此,结果代码对于两者都是相同的.

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