कोई वापसी प्रकार के साथ फ़ंक प्रतिनिधि


561

फंक प्रतिनिधियों के सभी एक मूल्य लौटाते हैं। .NET डेलिगेट्स क्या हैं जो शून्य को वापस करने वाले तरीकों के साथ उपयोग किए जा सकते हैं?

जवाबों:


759

सभी फंक प्रतिनिधि कुछ वापस करते हैं; सभी एक्शन प्रतिनिधि वापस शून्य हो जाते हैं।

Func<TResult> कोई तर्क नहीं लेता है और TResult लौटाता है:

public delegate TResult Func<TResult>()

Action<T> एक तर्क लेता है और एक मूल्य वापस नहीं करता है:

public delegate void Action<T>(T obj)

Action सबसे सरल, 'नंगे' प्रतिनिधि हैं:

public delegate void Action()

वहाँ भी है ( Func<TArg1, TResult>और Action<TArg1, TArg2>(16 तर्कों तक अन्य)। ये सभी (को छोड़कर Action<T>) .NET 3.5 (System.Core में परिभाषित) के लिए नए हैं।


11
FYI करें, बेस क्लास लाइब्रेरी के अगले संस्करण में Func और Action प्रकार शामिल होंगे जो चार से अधिक औपचारिक मापदंडों का समर्थन करते हैं। मुझे याद नहीं है कि वे कितने बड़े हैं।
एरिक लिपर्ट

88
.NET 4.0 में वे अब 8 पैरामीटर तक जाते हैं। अगर वे इसे बनाए रखते हैं, तो अगले संस्करण में यह ग्यारह हो जाएगा !! 11 !!!
माइकल वैन ओस्टरहॉट

9
वास्तव में, ऐसा लगता है कि वे 4.0 में 16 तक जाते हैं।
Tustin2121

7
1, 4, 16, 64, 256, 1024, 4096, 16384, 65536, ... यह स्पष्ट रूप से इंगित करता है कि संकलक को किसी फ़ंक्शन के साथ अधिक तर्कों का सामना करने में सक्षम होने की आवश्यकता होगी जो वर्तमान में भविष्य में किसी बिंदु पर होता है । !
क्रिस मॉर्गन

6
वास्तव में, Tustin2121 सही है, वे Func<,,, ... ,>.NET 4.0 में 16 मापदंडों (प्लस के मामले में एक वापसी प्रकार ) के लिए गए थे, लेकिन प्रत्येक "श्रृंखला" के अंतिम आठ प्रकारों में परिभाषित किया System.Core.dllगया है mscorlib.dll, इसलिए इसमें कारण नहीं होगा क्यों michielvoo उन्हें नहीं देखा था। हालाँकि, .NET संस्करण 4.5 और 4.5.1 में कोई अधिक फ़िक्सेस या क्रियाएँ नहीं जोड़ी गईं। क्या यह क्रम A170836 या A170875 हो जाएगा ? बने रहें।
जेपी स्टिग नीलसन

83

... कोई तर्क नहीं लेता है और एक शून्य वापसी प्रकार है?

मेरा मानना ​​है Action है इसका समाधान है।


47

सभी फ़ंक प्रतिनिधि कम से कम एक पैरामीटर लेते हैं

यह सच नहीं है। वे सभी कम से कम एक प्रकार का तर्क लेते हैं, लेकिन यह तर्क वापसी प्रकार को निर्धारित करता है।

इसलिए Func<T>कोई मानदंड स्वीकार नहीं करता है और एक मान लौटाता है। उपयोग Actionया Action<T>जब आप एक मूल्य वापस नहीं करना चाहते हैं।


27

कोशिश करो System.Func<T>औरSystem.Action


1
मुझे नहीं लगता कि 0 arg और whatnot .Net 2.0 में मौजूद है, हालाँकि।
ब्रायन

1
यह अजीब है: फनकनेट .net 2.0 में बिल्कुल भी मौजूद नहीं है, हालांकि प्रेडिकेट और एक्शन करते हैं।
जोएल कोएहॉर्न

2
.NET 2.0 के लिए MethodInvoker प्रतिनिधि का उपयोग करें।
ट्रेवर इलियट

.NET 2 में एक प्रतिनिधि प्रकार भी था ( Converter<TInput, TOutput>जो कि बाद की तरह था ) Func<T, TResult>। इसका उपयोग उस List<>.ConvertAllविधि में किया गया था जो प्रत्येक तत्व को किसी List<>अन्य ऑब्जेक्ट पर प्रोजेक्ट करता था , और सभी "फ़ंक्शन मान" को एक नए में रखता था List<>। (बाद में, कोई अक्सर इसके लिए लाइनक का उपयोग Selectकरता था।)
जेपी स्टिग नील्सन

0

कभी-कभी आप ईवेंट हैंडलिंग के लिए एक प्रतिनिधि लिखना चाहेंगे, जिस स्थिति में आप लाभ उठा सकते हैं, System.EvenHandler<T>जो objectदूसरे पैरामीटर के अतिरिक्त प्रकार के एक तर्क को स्वीकार करता है जो इससे प्राप्त होना चाहिए EventArgs। इवेंटहैंडलर लौट आएंगेvoid

मुझे व्यक्तिगत रूप से एक फ़ंक्शन बॉडी में एक बार कॉलबैक बनाने के लिए परीक्षण के दौरान यह उपयोगी लगा।


0

... कोई तर्क नहीं लेता है और एक शून्य वापसी प्रकार है?

यदि आप के लिए लिख रहे हैं System.Windows.Forms, तो आप भी उपयोग कर सकते हैं:

public delegate void MethodInvoker()

0

वापसी और गैर वापसी मूल्य सबरूटीन्स को आमंत्रित करने का एक बहुत आसान तरीका है। क्रमशः फंक और एक्शन का उपयोग कर रहा है। (यह भी देखें https://msdn.microsoft.com/en-us/library/018hxwa8(v=vs.110).aspx )

इस उदाहरण का प्रयास करें

using System;

public class Program
{
    private Func<string,string> FunctionPTR = null;  
    private Func<string,string, string> FunctionPTR1 = null;  
    private Action<object> ProcedurePTR = null; 



    private string Display(string message)  
    {  
        Console.WriteLine(message);  
        return null;  
    }  

    private string Display(string message1,string message2)  
    {  
        Console.WriteLine(message1);  
        Console.WriteLine(message2);  
        return null;  
    }  

    public void ObjectProcess(object param)
    {
        if (param == null)
        {
            throw new ArgumentNullException("Parameter is null or missing");
        }
        else 
        {
            Console.WriteLine("Object is valid");
        }
    }


    public void Main(string[] args)  
    {  
        FunctionPTR = Display;  
        FunctionPTR1= Display;  
        ProcedurePTR = ObjectProcess;
        FunctionPTR("Welcome to function pointer sample.");  
        FunctionPTR1("Welcome","This is function pointer sample");   
        ProcedurePTR(new object());
    }  
}

1
इस कोड स्निपेट के लिए धन्यवाद, जो कुछ सीमित, तत्काल सहायता प्रदान कर सकता है। एक उचित व्याख्या यह दर्शाती है कि समस्या का एक अच्छा समाधान क्यों है, यह दिखा कर इसके दीर्घकालिक मूल्य में बहुत सुधार होगा , और यह भविष्य के पाठकों को अन्य, समान प्रश्नों के साथ और अधिक उपयोगी बना देगा। कृपया अपने स्पष्टीकरण को संपादित करने के लिए कुछ स्पष्टीकरण जोड़ने के लिए, जिसमें आपके द्वारा की गई धारणाएँ शामिल हैं।
ugबग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.