我有一个方法正在接受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)
带你编码并通过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)
因为这两个act和SetHolder超过关闭holder,当Caller调用一个新的closure类实例被创建和新Action的Lambda和局部功能都被创建的代表.因此,结果代码对于两者都是相同的.
因此,考虑到您在这里使用它们的方式,它只是归结为可读性(正如许多R#建议所做的那样).本地函数可以说具有更好的语法,因此R#建议您以这种方式使用它.