2017-10-12 22 views
5

Mam metodę pobierającą Action<string> (zobacz prosty przykład poniżej), ale w metodzie wywołania, w której konstruuje się Action, Resharper sugeruje, że funkcja lokalna powinna być użytym.Używanie funkcji lokalnej przez działanie jako parametr wejściowy

Jakie są zalecane praktyki związane z używaniem funkcji lokalnych zamiast działań, czy ma to jakieś znaczenie, czy też istnieje świadomość, o której należy pamiętać?

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"); 
} 

Odpowiedz

6

Biorąc Ci kod i wprowadzenie go poprzez sharplab.io, widzimy, że kod zostanie obniżona do:

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"); 
    } 
} 

Ponieważ zarówno act i SetHolder są zamknięcia ponad holder, gdy Caller wywoływana jest wystąpienie nowej klasy zamknięcie jest utworzone i nowe delegaty Action są tworzone zarówno dla funkcji lambda, jak i lokalnej. Tak wynikowy kod jest identyczny dla obu.

Dlatego, biorąc pod uwagę sposób, w jaki używasz ich tutaj, po prostu sprowadza się do czytelności (jak wiele zaleceń R #). Lokalne funkcje zapewne mają lepszą składnię, więc R # zaleca używanie jej w ten sposób.

+0

Twoja odpowiedź była dla mnie bardziej osobliwa, ponieważ przeczytałem [tutaj] (https://www.danielcrabtree.com/blog/84/c-sharp-7-local-functions-are-funcs-too), że jeśli lokalna funkcja jest statyczna, chyba że uzyskuje dostęp do "tego", w przeciwnym razie są to metody instancji. Stworzyłem alternatywny przykład (patrz następny komentarz, ponieważ link jest za długi tutaj) w sharplab.io (dotąd nie wiedziałem o sharplab), który dodał trochę 'null' sprawdzania wokół' Action', ale nie Funkcja lokalna. Czy możesz rozwinąć różnicę? – Ayb4btu

+0

[Alternatywny przykład] (https://sharplab.io/#v2:CYLg1APgAgDABFAjAbgLACgoGYECY4DCcA3hnOQjlACyECGANgwKYBOAFAJQanoUKJcAHiQwAfHDoBjAC5wAvHADOCiUgCc7JZzR8KNOAGVmMgBIB7BsDbtRyzqoGbtushQAi5wzICuAMz92aRkdN3JPb39A4zNLa1ZQ9ABfDAxsBFoI3wDbQRFEcWUTCys2bnRefiViuJsAImAASyUABwY6AE84RoA7OClzHqVLZjrElOSgA===) przy użyciu co równa się 'statycznego action i Lokalnego funkcję. – Ayb4btu

+0

Myślę, że kliknąłem, dlaczego jest zerowa kontrola. "Akcja" jest zmienną i może mieć wartość zerową, podczas gdy funkcja lokalna z powodu braku poprawnej terminologii jest kontenerem syntaktycznym do przechowywania instrukcji, dlatego nie musi być sprawdzana pod kątem pustej wartości, ponieważ nie może wewnętrznie nieważne. – Ayb4btu

-1

Jedną z zalet funkcji lokalnych ponad delegatów na to, że ich wywoływanie nie ponosi w instancji delegata i przekazać wezwanie który stracił w swojej przykład dlatego, że otoczenie go z delegata do przekazania go do DoStuff.

Spójrz na documentation, aby dowiedzieć się wszystkiego o lokalnych funkcjach.

Powiązane problemy