2012-02-11 13 views
24

कुछ समान प्रश्न हैं लेकिन मेरी तरह बिल्कुल नहीं।तर्क के बिना शून्य फनक

क्या कोई फ़ंक्शन किसी फ़ंक्शन के लिए वापसी मूल्य (यानी शून्य) के बिना समकक्ष है और पैरामीटर के बिना?

संबंधित प्रश्न Func not returning anything? है लेकिन यह शून्य प्रकार के लिए उत्तर नहीं देता है।

(मुझे अपने दृश्य मॉडल से कार्यों को मेरे दृश्य में अनुरोध करने की आवश्यकता है)।

+0

@Anthony Pegram: लेकिन मैं एक कार्रवाई में एक प्रकार में भरने की जरूरत है और शून्य की संभावना नहीं है (मैं अपने प्रश्न संपादित करेंगे, मैं एक गलती की है)। –

उत्तर

37

आपका शब्द भ्रमित है। आप शायद मतलब "के बिना एक समारोह एक वापसी प्रकार और कोई पैरामीटर नहीं है।" बस System.Action है।

Action action =() => Console.WriteLine("hello world"); 
action(); 

अपनी टिप्पणी से:

लेकिन मैं एक कार्रवाई और शून्य में एक <T> प्रकार में भरने की जरूरत है एक संभावना नहीं है (मैं अपने प्रश्न संपादित करेंगे, मैं एक गलती की है)।

यह एक गलतफहमी को इंगित करता है। एक्शन प्रतिनिधि में टी इनपुट है। शून्य आउटपुट है। एक एक्शन प्रतिनिधि मूल रूप से एक प्रतिनिधि वापसी शून्य है। टी इनपुट का प्रकार है, यह उन पैरामीटर पर कार्य कर सकता है, जिन्हें आप तर्कों के साथ आपूर्ति करेंगे।

किसी भी दर पर, जैसा कि इस उत्तर और अन्य दिखाते हैं, आप किसी भी टी के बिना एक कार्य प्रतिनिधि हो सकते हैं, एक प्रतिनिधि जो कोई इनपुट नहीं लेता है।

+3

हाँ मैं पूरी तरह से चूक गया कि वैकल्पिक है। मदद के लिए धन्यवाद (और अन्य)। –

+0

@anthony मैं इसे 3.5 के पहले .NET Framework के साथ कैसे कर सकता हूं। कोई प्रतिनिधि कार्रवाई नहीं है। केवल प्रतिनिधि कार्रवाई प्रतिनिधि। –

+0

@ ph1983, सी # 3 से पहले, आप प्रतिनिधियों का उपयोग करेंगे, हालांकि सी # 2.0 * अज्ञात विधियों * के लिए समर्थन जोड़ा गया है। मेरे पास सही उदाहरण नहीं है, लेकिन आप [एमएसडीएन] (http://msdn.microsoft.com/en-us/library/0yw3tz5k.aspx) पर सुविधा के बारे में पढ़ सकते हैं। –

3

जो आप खोज रहे हैं वह एक क्रिया है। इसमें कोई पैरामीटर नहीं होता है, और कोई मूल्य नहीं देता है।

13

हां, Action के अलग-अलग ओवरलोड हैं जो इनपुट पैरामीटर की एक अलग संख्या लेते हैं और void रिटर्न प्रकार रखते हैं।

Action    public delegate void Action() 
Action<T>    public delegate void Action<T>(T obj) 
Action<T1,T2>   public delegate void Action<T1,T2>(T1 arg1, T2 arg2) 
Action<T1,T2,T3>  public delegate void Action<T1,T2,T3>(T1 arg1, T2 arg2, T3 arg3) 
... 

पहली पंक्ति वह है जिसे आप ढूंढ रहे हैं।

नए फ्रेमवर्क संस्करणों ने और भी तर्क के साथ अधिभार जोड़ा है। तर्कों की अधिकतम संख्या:

  • .NET फ्रेमवर्क 2.0:    
  • .NET फ्रेमवर्क 3.5:    
  • .NET फ्रेमवर्क 4।0:
  • सिल्वरलाइट:                                    

क्रिया हमेशा एक void वापसी प्रकार। एक void रिटर्न प्रकार की आवश्यकता नहीं है और सामान्य प्रकार पैरामीटर के रूप में निर्दिष्ट नहीं किया जा सकता है। इसके विपरीत, Func प्रतिनिधियों "असली" वापसी प्रकार को परिभाषित और हमेशा वापसी प्रकार के लिए कम से कम एक सामान्य प्रकार पैरामीटर है:

Func<TResult>   public delegate TResult Func<TResult>() 
Func<T,TResult>   public delegate TResult Func<T,TResult>(T arg) 
Func<T1,T2,TResult>  public delegate TResult Func<T1,T2,TResult>(T1 arg1, T2 arg2) 
... 

.NET फ्रेमवर्क 4.0 सामान्य प्रकार के in और out संशोधक जोड़ा गया है contravariance और covariance के लिए पैरामीटर। देखें: Covariance and Contravariance in Generics। उदाहरण:

public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2) 

public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2) 
संबंधित मुद्दे