2010-04-10 11 views

उत्तर

14

बेनामी प्रकारों में संपत्ति के नाम होते हैं जो अधिक जानकारी लेते हैं, जिनके पास आपके पास यह नहीं है। आप अज्ञात प्रकारों का उपयोग रिटर्न मानों और पैरामीटर के रूप में नहीं कर सकते हैं और आप tuples के साथ कर सकते हैं।

जब एक टुपल अच्छा होता है तो इसका एक उदाहरण होता है जब आप कई मान वापस करना चाहते हैं। @ पीटर मिनचेव mentions this link जो एक अच्छा उदाहरण देता है।

आप Find() विधि जो एक सूचकांक और मूल्य दोनों लौटा सकते हैं। एक और उदाहरण 2 डी या 3 डी विमान में स्थिति होगी।

18

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

Tuple<int, string> GetTuple() 
{ 
    return Tuple.Create(1, "Bob"); 
} 

आपको गुमनाम प्रकार के साथ ऐसा नहीं कर सकते, आप के बजाय System.Object वापस जाने के लिए होगा। आम तौर पर, आप अलग-अलग गुणों के मूल्य प्राप्त करने के लिए इन ऑब्जेक्ट्स पर प्रतिबिंब (या dynamic .NET 4) का उपयोग करना समाप्त कर देते हैं। Item1, Item2, Item3 वे कर रहे हैं हमेशा और इतने पर, एक गुमनाम प्रकार के साथ, जबकि आप के नाम का चयन करने के लिए मिल -

इसके अलावा, के रूप में ब्रायन का उल्लेख है, एक Tuple पर संपत्ति के नाम तय कर रहे हैं। यदि आप लिखना:

var x = new { ID = 1, Name = "Bob" } 

फिर गुमनाम प्रकार वास्तव में ID और Name गुण है। लेकिन अगर आप लिखें:

Tuple.Create(1, "Bob") 

फिर जिसके परिणामस्वरूप टपल सिर्फ गुण Item1 और Item2 है।

8

अनाम प्रकारों के पक्ष में एक और बिंदु यह होगा कि आप आसानी से 8 से अधिक गुण प्राप्त कर सकते हैं। हालांकि यह tuples का उपयोग कर करने योग्य है, यह इतना सुंदर नहीं है।

var tuple = Tuple.Create(1, 2, 3, 4, 5, 6, 7, Tuple.Create(8, 9)); //and so on 

या अपनी खुद की tuple कक्षाएं लिखें।


नोट करने के लिए एक दिलचस्प समानता है कि दोनों tuples और अनाम प्रकार आप अचल स्थिति और समानता तुलनीयता (दोनों ओवरराइड Equals और GetHashCode) डिफ़ॉल्ट रूप से गुणों के आधार पर देना है।

8

सी # 7 जंगली में बाहर होने के बाद से इस उत्तर के लिए बस थोड़ा सा अपडेट है। टुपल्स में अब सुपर पावर हैं और कभी-कभी गुमनाम प्रकारों और कक्षाओं को प्रतिस्थापित कर सकते हैं। उदाहरण के लिए इस विधि को स्वीकार करें जो नामित गुणों के साथ tuples स्वीकार करता है और देता है।

void Main() 
{ 
    var result = Whatever((123, true)); 
    Debug.Assert(result.Something == 123); 
    Debug.Assert(result.Another == "True"); 
} 

(int Something, string Another) Whatever((int Neat, bool Cool) data) 
{ 
    return (data.Neat, data.Cool.ToString()); 
} 

यह अच्छा है।