2017-10-12 57 views
5

我有一个方法正在采用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"); 
} 

回答

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调用一个新的closure类实例为lambda函数和本地函数创建并新创建Action委托。所得到的代码对于两者来说都是相同的。

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

+0

您的回答让我更加好奇,因为我读过[这里](https://www.danielcrabtree.com/blog/84/c-sharp-7-local-functions-are-funcs-too),如果本地函数是静态的,除非它访问'this',否则它们是实例方法。我在sharplab.io中创建了一个替代示例(请参阅下一个评论,因为链接太长了)(我不知道sharplab到现在为止),它在“Action”周围添加了一些“null”检查,但不是本地功能。你能否详细说明这种差异? – Ayb4btu

+0

[替代示例](https://sharplab.io/#v2:CYLg1APgAgDABFAjAbgLACgoGYECY4DCcA3hnOQjlACyECGANgwKYBOAFAJQanoUKJcAHiQwAfHDoBjAC5wAvHADOCiUgCc7JZzR8KNOAGVmMgBIB7BsDbtRyzqoGbtushQAi5wzICuAMz92aRkdN3JPb39A4zNLa1ZQ9ABfDAxsBFoI3wDbQRFEcWUTCys2bnRefiViuJsAImAASyUABwY6AE84RoA7OClzHqVLZjrElOSgA===)使用什么相当于一个'静态Action'和局部功能。 – Ayb4btu

+0

我想我点了为什么有空检查。 “Action”是一个变量,可以为null,而本地函数由于缺乏正确的术语,因此不需要检查null的语法容器,因为它不能被检查为null,本质上是空的。 – Ayb4btu

-1

一个局部功能上代表的好处是,调用它们并不在一个委托实例招致并委托其在你的榜样,因为你是一个代表它包裹将它传递给DoStuff失去调用。

看看documentation了解全部关于本地功能