我有一个接受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");
}
答案 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");
}
}
因为act
和SetHolder
都是holder
的闭包,所以当调用Caller
时,会创建一个新的闭包类实例并创建新的Action
个委托对于lambda和local函数。因此,结果代码对于两者都是相同的。
因此,考虑到你在这里使用它们的方式,它只是归结为可读性(正如许多R#建议所做的那样)。本地函数可以说有更好的语法,所以R#建议你这样使用它。
答案 1 :(得分:-1)
本地函数相对于委托的一个好处是,调用它们不会导致委托实例化和委托调用在示例中丢失,因为您使用委托将其包装以将其传递给DoStuff
。
查看documentation了解本地功能的所有信息。