2010-02-02 20 views
9

पास करना मेरे पास एक साधारण सवाल है: फ़ंक्शन संदर्भ को पारित करने के विरोध में सी # प्रतिनिधि को तत्काल करने का क्या फायदा है? क्या मेरा मतलब है:सी # प्रतिनिधि इंस्टेंटेशन बनाम बस विधि संदर्भ

क्यों:

Thread t = new Thread(new ThreadStart(SomeObject.SomeMethod)); 

जब आप कर सकते हैं: कुछ

Thread t = new Thread(SomeObject.SomeMethod); 

दोनों संकलन और मेरे अनुभव में काम करेंगे ... मुझे याद आ रही?

+0

संभावित डुप्लिकेट [नई क्रिया() और लैम्ब्डा के बीच क्या अंतर है?] (Http://stackoverflow.com/questions/765966/what-is-the-difference-between-new-action-and- ए-लैम्ब्डा) – nawfal

उत्तर

6

जब तक विधि समूह SomeObject.SomeMethod में वापसी प्रकार void के साथ एक विधि है और कोई पैरामीटर नहीं लेना कोई अंतर नहीं है। ऐसा इसलिए है क्योंकि ThreadStart को delegate के रूप में परिभाषित किया गया है जो void देता है और कोई पैरामीटर नहीं लेता है और इसलिए विधि समूह SomeObject.SomeMethod से ThreadStart पर एक अंतर्निहित रूपांतरण होता है। इस प्रकार, दोनों Thread कन्स्ट्रक्टर के ओवरलोड Thread(ThreadStart) का आविष्कार कर रहे हैं।

भाषा विनिर्देश का प्रासंगिक खंड §6.6 (विधि समूह रूपांतरण) है।

मेरे पास एक साधारण सवाल है: फ़ंक्शन संदर्भ को पारित करने के विरोध में सी # प्रतिनिधि को तत्काल करने का क्या फायदा है?

तो, यहां शब्दावली का एक सुधार।

class MyObject { 
    public void SomeMethod() { } 
} 

MyObject someObject = new MyObject(); 

के साथ बात someObject.SomeMethod से दर्शाया जाता है एक विधि समूह है। आप केवल इसके बारे में सोच सकते हैं क्योंकि ओवरलोडेड विधियों के सेट को someObject.SomeMethod नोटेशन का उपयोग करके देखा जा सकता है।

+1

'someObject.SomeMethod()' एक विधि समूह भी है? –

+1

@ जॉन फेमिनेला: नहीं, यह एक विधि आमंत्रण होगा। – jason

+0

हम्म, ठीक है। क्या होगा यदि 'कुछ विधि' में कई अधिभार थे जिनके हस्ताक्षर 'SomeMethod (...)' से मेल खाते थे, जहां '...' मनमानी पैरामीटर हैं? क्या यह एक विधि समूह है, क्योंकि यह कई तरीकों में से एक को संदर्भित कर सकता है और अभी तक इसका समाधान नहीं हुआ है? –

4

कंपाइलर अनुमान लगाएगा कि जब आपने छोटा कोड टाइप किया था, तो आपका मतलब लंबा कोड था। परम प्रभाव में कोई अंतर नहीं है। यदि आप पूर्ण कन्स्ट्रक्टर की स्पष्टता चाहते हैं, तो आप इसे डाल सकते हैं; यदि आप केवल विधि समूह की संक्षिप्तता चाहते हैं, तो आप कंपाइलर को कन्स्ट्रक्टर का अनुमान लगाने की अनुमति दे सकते हैं। यह सिर्फ एक स्टाइलिस्ट पसंद है।

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