2017-10-12 13 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"); 
    } 
} 

क्योंकि दोनों act और SetHolderholder से अधिक बंद कर रहे हैं, जब Caller एक नया बंद वर्ग उदाहरण शुरू हो जाती है है बनाया गया और नया Action प्रतिनिधि लैम्ब्डा और स्थानीय फ़ंक्शन दोनों के लिए बनाए जाते हैं। तो परिणामी कोड दोनों के लिए समान है।

इसलिए, जिस तरह से आप उन्हें यहां उपयोग कर रहे हैं, वैसे ही यह पठनीयता के लिए नीचे आता है (जैसा कि कई आर # सिफारिशें करते हैं)। स्थानीय कार्यों में तर्कसंगत रूप से बेहतर वाक्यविन्यास होता है, इसलिए आर # अनुशंसा करता है कि आप इसे इस तरह इस्तेमाल करें।

+0

आपके उत्तर ने मुझे और अधिक उत्सुक बना दिया क्योंकि मैंने पढ़ा था [यहां] (https://www.danielcrabtree.com/blog/84/c-sharp-7-local-functions-are-funcs-too) कि अगर कोई स्थानीय फ़ंक्शन स्थैतिक है जब तक कि यह 'इस' तक पहुंच न जाए, अन्यथा वे उदाहरण विधियां हैं। मैंने sharplab.io (मुझे अब तक sharplab के बारे में नहीं पता था) में एक वैकल्पिक उदाहरण बनाया है (लिंक के लिए बहुत लंबा होने के कारण अगली टिप्पणी देखें) जिसने 'एक्शन' के आस-पास कुछ' शून्य 'जांच की लेकिन नहीं स्थानीय समारोह क्या आप अंतर पर विस्तार कर सकते हैं? – Ayb4btu

+0

[वैकल्पिक उदाहरण] (https://sharplab.io/#v2:CYLg1APgAgDABFAjAbgLACgoGYECY4DCcA3hnOQjlACyECGANgwKYBOAFAJQanoUKJcAHiQwAfHDoBjAC5wAvHADOCiUgCc7JZzR8KNOAGVmMgBIB7BsDbtRyzqoGbtushQAi5wzICuAMz92aRkdN3JPb39A4zNLa1ZQ9ABfDAxsBFoI3wDbQRFEcWUTCys2bnRefiViuJsAImAASyUABwY6AE84RoA7OClzHqVLZjrElOSgA===) का उपयोग क्या एक 'स्थिर Action' और स्थानीय समारोह के बराबर है। – Ayb4btu

+0

मुझे लगता है कि मैंने क्लिक किया कि शून्य जांच क्यों है। 'Action' इसलिए यह, के रूप में यह नहीं कर सकता है अशक्त के लिए जांच की जानी चाहिए नहीं है एक चर रहा है और अशक्त हो सकता है, जबकि स्थानीय समारोह सही शब्दावली, बयानों के आयोजन के लिए एक वाक्य-कंटेनर की कमी के लिए, है, आंतरिक रूप से शून्य हो। – Ayb4btu

-1

प्रतिनिधियों से अधिक स्थानीय कार्यों के लाभों में से एक है कि उन्हें लागू एक प्रतिनिधि इन्स्टेन्शियशन में उठाना नहीं है और मंगलाचरण जो अपने उदाहरण में खो जाता है क्योंकि आप इसे एक प्रतिनिधि के साथ लपेटकर रहे DoStuff करने के लिए इसे पारित करने के लिए प्रतिनिधि कर रहे हैं।

documentation पर एक नज़र सब के बारे में स्थानीय समारोहों पता करने के लिए है।

संबंधित मुद्दे

 संबंधित मुद्दे