2012-09-20 5 views
10

मैं निम्नलिखित वर्ग घोषणा समझ में नहीं आता:सी # में "कम से कम" और "ग्रेटर से अधिक" प्रतीकों के बीच कक्षा के नाम रखने का क्या उद्देश्य है?

public abstract class Class1 <TDomainServiceContract, TDomainService> 
{ 
    ... 
} 

मुझे पता है कि TDomainServiceContract और TDomainService रहे हैं, लेकिन वे क्यों < और > प्रतीकों के बीच किया जाता है?

+2

वे [सामान्य प्रकार पैरामीटर] हैं (http://msdn.microsoft.com/en-us/library/ms172192.aspx)। – verdesmarald

+1

धन्यवाद, लेकिन आपने इस सवाल को बंद करने के लिए क्यों कहा, कुछ अन्य उपयोगकर्ताओं की तरह, यह कहकर कि यह वास्तविक सवाल नहीं है? मैं देखता हूं कि मेरे "संदेश" में एक प्रश्न चिह्न है, शायद यह आपके ब्राउज़र में प्रस्तुत नहीं किया गया है? मुझे यह समझने की जरूरत है कि यह साइट कैसे काम करती है ... –

उत्तर

26

< और > के बीच पैरामीटर सामान्य प्रकार पैरामीटर हैं। जेनिक्स, एक बहुत ही उच्च स्तर पर, आपको विशेष के बारे में अज्ञात है जो एक या अधिक पैरामीटर, गुणों या विधियों के प्रकार के बारे में अज्ञात है। शब्दों के साथ व्याख्या करना थोड़ा मुश्किल है, लेकिन जेनेरिक का सबसे आम उपयोग संग्रह में है।

जेनेरिक से पहले, अधिकांश डेवलपर्स ने ऑब्जेक्ट्स के संग्रहों का ट्रैक रखने के लिए ArrayList जैसी चीजों का उपयोग किया। इसका नकारात्मक सुरक्षा सुरक्षा थी; क्योंकि आप को ArrayList में डाल सकते हैं, जिसका मतलब है कि आपको अपनी ऑब्जेक्ट को अपेक्षित प्रकार (कोड को कम साफ करना) पर डालना था, और आपके पास नहीं था जो ऑब्जेक्ट का प्रकार था (यानी मेरे पास ArrayList हो सकता है कि मुझे केवल string ऑब्जेक्ट्स रखने की उम्मीद हो सकती है, लेकिन मैं - गलती से - int या DbConnection इत्यादि में डाल सकता हूं), और जब आप अपनी कास्ट करते हैं तो आप रनटाइम तक कभी नहीं खोज पाएंगे अनुत्तीर्ण होना।

ArrayList myStrings = new ArrayList(); 

myStrings.Add("foo"); 
myStrings.Add("bar"); 
myStrings.Add(1); // uh-oh, this isn't going to turn out well... 

string string1 = (string)myStrings[0]; 
string string2 = (string)myStrings[1]; 
string string3 = (string)myStrings[2]; // this will compile fine but fail at 
             // runtime since myStrings[2] is an int, 
             // not a string 

जेनरिक पेश किए जाने के बाद, हमें List<T> कक्षा मिली। यह एक एकल वर्ग है जो एक सामान्य प्रकार का तर्क लेता है - अर्थात्, उन वस्तुओं का प्रकार जिन्हें आप सूची की उम्मीद कर रहे हैं।इस तरह से, मैं हो सकता है एक List<string> या एक List<int> है कि एक) कास्टिंग की आवश्यकता होगी नहीं है, क्योंकि indexers string और int क्रमश: लौटने के लिए, और ख) संकलन समय पर सुरक्षित हो, के रूप में मुझे पता है कि एक string या एक int अलावा कुछ भी नहीं (क्रमशः, क्रमशः) उन सूचियों में रखा जा सकता है।

List<string> myStrings = new List<string>(); 

myStrings.Add("foo"); 
myStrings.Add("bar"); 
myStrings.Add(1); // this will not compile, as an int is not a string 

जेनरिक की बात कहने के लिए कि आप क्या वास्तविक प्रकार उद्देश्य यह है कि आप के साथ काम कर रहे हैं की है के बारे में परवाह नहीं है, लेकिन अपने वर्ग पराक्रम का उपभोक्ता। दूसरे शब्दों में, एक सूची string, int, DbConnection इत्यादि को कैसे स्टोर कर सकती है यांत्रिकी के समान हैं, लेकिन जेनेरिक इसे बनाते हैं ताकि आपकी कक्षा के उपभोक्ता से आने वाली इस प्रकार की जानकारी आपके अबास्ट्रक्शन में खो न जाए।

+2

+1 मैं बस सी # सीखना शुरू कर रहा हूं और यह वही था जो मुझे चाहिए था। चीयर्स! – AlienWebguy

6

ये generic type parameters हैं।

उनका मतलब है कि कक्षा एक सामान्य वर्ग है, उदाहरण के लिए बाधाओं के साथ आपके उदाहरण में - दोनों को DomainContext या उससे प्राप्त कक्षाएं होने की आवश्यकता है।

विवरण के लिए एमएसडीएन पर Introduction to Generics (C# Programming Guide) देखें।

1

यह इंगित करता है कि कक्षा का उपयोग करते समय आप TDomainServiceContract के लिए कोई भी प्रकार प्रदान कर सकते हैं जो DomainContext लागू करता है। तो चलो इस तरह एक वर्ग मान लें:

public class MyDomainContext : DomainContext 
{ 
    ... 
} 

मैं जब एक नया Class1 इस तरह बनाने के उस वर्ग का उपयोग कर सकते हैं:

var o = new Class1<MyDomainContext, MyDomainService>(); 

क्योंकि यह DomainContext लागू करता है। TDomainService के लिए भी यही है।

1

इसे देखने का एक और तरीका एक सरल उदाहरण में है। उदाहरण के लिए:

List<String> myStrings = new List<String>(); 
myStrings.Add("One"); 
//Etc. 

इस उदाहरण में, आप बस यह पहचान रहे हैं कि आप कक्षा के साथ किस डेटा प्रकार का उपयोग करेंगे। आपके उदाहरण में इसी तरह की स्थिति।

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