2009-05-27 19 views

उत्तर

561

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

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

public delegate TResult Func<TResult>() 

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

:

public delegate void Action<T>(T obj) 

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

public delegate void Action() 

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

+8

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

+0

मैंने यह नहीं सुना था, एरिक के सिर के लिए धन्यवाद! –

+66

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

23

प्रयास करें System.Func<T> और System.Action

+1

मैं, नेट 2.0 में नहीं लगता है, हालांकि 0 आर्ग और whatnot मौजूद हैं। – Brian

+1

यह अजीब बात है: .NET 2.0 में Func मौजूद नहीं है, हालांकि भविष्यवाणी और कार्य करें। –

+2

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

49

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

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

38

समारोह प्रतिनिधियों के सभी कम से कम एक पैरामीटर

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

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

0

कभी कभी आप घटना से निपटने के लिए एक प्रतिनिधि, जिस स्थिति में आप System.EvenHandler<T> जो परोक्ष दूसरा पैरामीटर कि EventArgs से निकाले जाते हैं चाहिए के अलावा प्रकार object का एक तर्क स्वीकार करता है का लाभ ले सकते लिखने के लिए चाहते हैं। EventHandlers void

मैं व्यक्तिगत रूप से इस उपयोगी पाया वापस आ जाएगी एक समारोह शरीर में एक बंद कॉलबैक बनाने के लिए परीक्षण के दौरान।

-2

वापसी और गैर वापसी मान सबरूटीन्स आह्वान करने के लिए एक बहुत ही आसान तरीका है। समारोह और कार्रवाई क्रमशः उपयोग कर रहा है। (देखें भी 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()); 
    } 
} 
+0

इस कोड स्निपेट के लिए धन्यवाद, जो कुछ सीमित, तत्काल सहायता प्रदान कर सकता है। ए [उचित स्पष्टीकरण अपने दीर्घकालिक मूल्य में काफी सुधार करेगा] (// meta.stackexchange.com/q/114762/350567) दिखाकर * क्यों * यह समस्या का एक अच्छा समाधान है, और भविष्य के लिए इसे और अधिक उपयोगी बना देगा अन्य, समान प्रश्नों के साथ पाठक। आपके द्वारा किए गए अनुमानों सहित कुछ स्पष्टीकरण जोड़ने के लिए कृपया अपना उत्तर संपादित करें। – iBug

0

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

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

public delegate void MethodInvoker() 
संबंधित मुद्दे