2010-04-30 5 views
24

मैं एक वीबी.Net लड़का हूँ। (क्योंकि मुझे होना है, क्योंकि जो व्यक्ति मेरी जांच पर हस्ताक्षर करता है, वह कहता है।: पी) मैं जावा में बड़ा हुआ और मुझे आम तौर पर मौका मिलने पर सी # में पढ़ने या लिखने के लिए संघर्ष नहीं होता है। मैं आज कुछ वाक्यविन्यास में आया था कि मैंने कभी नहीं देखा है, और मुझे पता लगाना प्रतीत नहीं होता है।सी # में, विधि घोषणा के बाद <T> क्या है?

निम्नलिखित विधि घोषणा में, < टी> प्रतिनिधित्व करता है?

static void फू < टी> (पैरामीटर टी [] x)

मैं सामान्य संग्रह और चीजों की घोषणा के साथ मिलाकर प्रयोग देखा है, लेकिन मैं नहीं करने के लिए मुझे के जीवन पता लगा सकते हैं कि क्या इसके लिए करता है यह विधि।

यदि यह महत्वपूर्ण है, तो मैं C# brain teasers के बारे में सोचते समय इसे पार कर गया। छठे टीज़र में संपूर्ण कोड स्निपेट होता है।

उत्तर

20

यह generic method को परिभाषित करता है, जो generics का एक रूप है, जिसे सी # 2.0 में सी # में जोड़ा गया था।

विधि sig होना चाहिए:

static void Foo<T>(params T[] x) 
{ // ... 

यह आप किसी भी (विशिष्ट) के तर्कों के किसी भी संख्या को पारित विधि फू में लिखने देता है, और यह तर्क की कि सरणी पर कार्य करता है। यह विधि के लिए स्कॉप्ड को छोड़कर, सामान्य प्रकार के काम के समान ही है। <T> निर्दिष्ट करता है तर्क के प्रकार के विधि में पारित किया जा रहा है, तो आप इस तरह कॉल कर सकते हैं:

Foo<MyClass>(myClassInstance, myClassInstance2, mySubclassInstance); 
+0

विशेष रूप से, यह नाम को परिभाषित करता है (या नाम) विधि में सामान्य प्रकार (ओं) के लिए इस्तेमाल करते हैं। –

+1

मेरी समझ यह है कि इस कोड में, (पैरा टी [] x) यह घोषणा करने के लिए ज़िम्मेदार है कि विधि प्रकार टी के किसी भी तर्क को लेती है और उन्हें x द्वारा संदर्भित सरणी में संग्रहीत करती है। यदि यह सही है, तो विधि नाम के बाद < T > घोषणा में क्या जोड़ता है? – Drew

+0

शायद यह कॉलर पैरामीटर के रूप में पारित चर के प्रकार का वर्णन करने में अधिक verbose होने की अनुमति देता है। क्या मैं फू को एक लाइन के साथ कॉल करने में सक्षम हूं जो Foo (myClassInstance, myClassInstance2) पढ़ता है जब तक कि myClassInstance और myClassInstance2 एक ही प्रकार के होते हैं? – Drew

1

एक सामान्य विधि के सामान्य प्रकार पैरामीटर है कि।

एक बार जब आप विधि को कॉल करते समय टी के लिए एक प्रकार निर्दिष्ट करते हैं, तो .NET उस प्रकार पैरामीटर के आधार पर प्रकार की सुरक्षा सुनिश्चित कर सकता है।

static void Foo<T>(params T[] x) { } 

की तरह कहा जा सकता है:

string[] names = new string[] {"Foo", "Bar", "Baz"}; 

Foo<string>(names); 

लेकिन यह एक संकलक त्रुटि उत्पन्न होगी:

int[] nums = new int[] {1, 2, 3}; 

Foo<string>(nums); // nums is not string[] 
1

टी एक type parameter है और इस मामले में कुछ भी हो सकता (एक बाधा हो सकती है निर्दिष्ट किया जाना चाहिए, लेकिन यहां कोई बाधा नहीं है)। इस सुविधा के बिना आप हर प्रकार का उपयोग करने वाले के लिए प्रणाली की घोषणा करने के लिए होगा: जेनरिक पर

static void Foo(params int[] x)  
static void Foo(params string[] x)  
static void Foo(params Customer[] x)  
etc... 

अधिक जानकारी MSDN पर पाया जा सकता है: Introduction to Generics (C#)

+0

यहां जेनेरिक प्रकार पर एमएसडीएन पृष्ठ है http://msdn.microsoft.com/en-us/library/512aeb7t.aspx – Armstrongest

25

जो आप पूछ रहे हैं वह जेनिक्स में जेनिक्स की अवधारणा है। जेनिक्स का उपयोग करके आप इस विधि का उपयोग उन प्रकारों के लिए कर सकते हैं जिन्हें आप चाहते हैं

मान लीजिए कि आपको दो संख्याओं को जोड़ने के लिए एक फ़ंक्शन बनाना है। उस मामले में, अपने कार्य

//For integer : 
public int sum(int a, int b) 
{ 
    return a + b; 
} 



//For floating point numbers : 
public float sum(float a, float b) 
{ 
    return a + b; 
} 

है इस तर्क के बाद, यदि आप एक समारोह है कि दो डबल प्रकार संख्या का योग होगा आप इतने पर एक और समारोह बनाते हैं, और होगा चाहते हैं।

जेनरिक की मदद आप इन सभी कार्यों के की जगह और निम्नलिखित लिख सकते हैं के साथ बू,

public T sum<T>(T a, T b) 
{ 
    return a + b; 
} 

यह सब सांख्यिक प्रकार के लिए, साथ ही तार के लिए काम करेंगे।

और अधिक विस्तार के लिए बाहर की जांच करें: http://www.codeproject.com/kb/books/EssentialCS20.aspx

+3

कोड नमूना के लिए +1 और उदाहरण का पालन करने में आसान है! पूछे गए प्रश्न और ओपी के समझ के स्तर की स्पष्ट समझ दिखाता है। – Armstrongest

+0

अच्छे उदाहरणों के साथ अच्छा जवाब। – backslash17

+2

उदाहरण समझना आसान है, हालांकि यह काम नहीं करता है। आप सामान्य प्रकार टी के दो चर जोड़ नहीं सकते हैं। देखें: http://stackoverflow.com/questions/32664/c-generic-constraint-for-only-integers वर्कअराउंड बाहरी पुस्तकालय से जेनेरिक ऑपरेटरों का उपयोग करना है: http://www.yoda.arachsys.com/csharp/miscutil/usage/genericoperators.html –

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