फंक <टी> () बनाम फंक <टी>। इंवोक ()


83

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

public T DoWork<T>(Func<T> method)
{
    return (T)method.Invoke();
}

बनाम

public T DoWork<T>(Func<T> method)
{
    return (T)method();
}

या मैं पूरी तरह से गलत रास्ते पर हूँ :) धन्यवाद।


जवाबों:


113

कोई अंतर नहीं है। दूसरे के लिए सिर्फ एक आशुलिपि है Invoke, जो संकलक द्वारा प्रदान की जाती है। वे उसी आईएल को संकलित करते हैं।


1
इन्वोक () विधि को बंद करने के परिणामस्वरूप संकलक त्रुटि होती है: "स्पष्ट रूप से 'System.Func <T>' को 'T' में परिवर्तित नहीं किया जा सकता है।" मैं .NET 4 के खिलाफ संकलन कर रहा हूँ
माइक

2
@ माइक: यदि आप कोष्ठक बंद होने से चूक गए हैं तो ऐसा होगा - यानी (T)methodबजाय लौटने की कोशिश की (T)method()
जॉन स्कीट

@JonSkeet तो क्या यह लड़का यहाँ गलत है: social.msdn.microsoft.com/Forums/en-US/…
superlogical

4
@ सुपरप्रोलॉजिकल: यहां दो समस्याएं हैं। सबसे पहले, वहाँ सवाल सीधे एक विधि को कॉल करने और एक प्रतिनिधि के माध्यम से कॉल करने के बीच अंतर के बारे में है। यह एक अंतर नहीं है foo()और एक प्रतिनिधि प्रकार का एक चर foo.Invoke()कहाँ fooहै। दूसरी समस्या यह है कि उत्तर के बारे में बात कर रहा है Control.Invoke, जो Invokeएक प्रतिनिधि को बुलाने के समान नहीं है ।
जॉन स्कीट

2
@LucaCremonesi: यदि यह एक विधि कॉल का परिणाम है, तो मैं आमतौर पर पसंद करता हूं Invoke, जैसा GetAction()()कि अजीब लगता है, लेकिन GetAction().Invoke()ठीक है। लेकिन मैं किसी भी तरह से, अधिकांश भाग के लिए बुरा नहीं मानता।
जॉन स्कीट

17

Invoke नए C # 6 नल प्रसार ऑपरेटर के साथ अच्छी तरह से काम करता है, अब आप कर सकते हैं

T result = method?.Invoke();

के बजाय

T result = method != null ? method() : null;

क्या आप एक परिदृश्य का वर्णन कर सकते हैं जहाँ यह उपयोगी है? पाठ्यपुस्तक का मामला घटनाओं को बढ़ा रहा है।
गसडॉर

1
उदाहरण के लिए आपके पास एक वैकल्पिक फ़नक पैरामीटर हो सकता है कि यदि कोई मान असाइन नहीं किया गया है, तो डिफ़ॉल्ट (फ़नक) है जो अशक्त है और इसे अनदेखा किया गया है।
ऑस्टिन सालगट

1
यह घटनाओं और अन्य मल्टी-कास्ट प्रतिनिधियों के लिए सामान्य मामला है - वे आमतौर पर अशक्त के साथ आरंभिक होते हैं और कॉल करने के बाद गैर-शून्य मान प्राप्त करते हैं +=। इसलिए यदि आप किसी कार्यक्रम में आग लगाने जा रहे हैं और यह नहीं जानते कि क्या कोई सदस्यता है, तो संक्षिप्त समाधान कॉल करना है ?.Invoke(...)
स्टॉप-क्रेप 16'19
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.