2009-06-22 16 views
7

अनाम प्रकारों के लिए सबसे अच्छे उपयोग के मामले क्या हैं?अनाम प्रकारों का उद्देश्य क्या है?

ऐसा लगता है कि वे केवल सीमित संदर्भ में उपयोगी हैं, उदाहरण के लिए एक वर्ग या एक समारोह। इनका संदर्भ के बिना उनका शायद ही उपयोग किया जा सकता है, क्योंकि प्रतिबिंब के बिना कोई भी नहीं जानता कि इन प्रकारों पर कौन से गुण उपलब्ध हैं।

उत्तर

4

बेनामी प्रकारों का उपयोग केवल बहुत संकीर्ण क्षेत्रों में ही किया जाना है। मेरे लिए जिन मामलों का मैंने उपयोग किया है उनमें लिंक शामिल हैं।

var result = from x in MyCollection 
      select new 
      { 
       x.Prop1, 
       x.Prop2 
      }; 

इसके अलावा, एसक्यूएल को Linq के मामले में - गुमनाम प्रकार का उपयोग कर स्तंभ ही गुमनाम प्रकार में उपयोग किया जाता चुन कर विभिन्न एसक्यूएल उत्पन्न होगा। उपर्युक्त मामले में (यदि यह SQL क्वेरी के लिए एक लिंक था), तो यह सभी फ़ील्ड चुनने के बजाय "proptable का चयन करें, mytable से prop2" जैसे कुछ उत्पन्न करेगा।

मैंने कभी भी ऐसी स्थिति नहीं चली है जहां मैं अपने कोड में एक नया अनाम प्रकार घोषित करना चाहता हूं। मुझे लगता है कि अगर कुछ और हो, तो यह स्थानीय स्थिरांक के लिए एक अच्छा उपयोग होगा?

var x = new 
     { 
      FirstName = "Scott", 
      LastName = "Ivey" 
     }; 
+0

हम्म ... स्थानीय स्थिरांक एक दिलचस्प विचार है। हां, मैंने उनके बारे में LINQ प्रश्नों के साथ उपयोग किया है, लेकिन यह अभी तक मेरे लिए उपयोगी नहीं था। –

0

सही; वे केवल एक चरम सीमा के भीतर व्यावहारिक हैं।

+1

क्या आप किसी भी अच्छे उपयोग के मामलों के बारे में जानते हैं? –

2

हालांकि, यह रोक नहीं है उदा। ASP.NET MVC टीम आप जादू तार का भारी इस्तेमाल की वजह से, एक Hashtable शैली पैरामीटर वस्तु के रूप में उपयोग ...

Url.Action(new{controller="Home", action="Index"}) 

कौन सा मैं प्रोत्साहित नहीं होगा, हालांकि।

मैं लगभग विशेष रूप से LINQ-statement में अज्ञात प्रकारों का उपयोग करता हूं जहां उसी विधि में आप परिणामसेट पर फिर से प्रयास करते हैं। यह बहुत अधिक है कि उन्हें

1

वे उपयोगी हैं जब भी आप कुछ वस्तुओं पर एक क्वेरी चलाने और उसके बाद (पुनरावृति की तरह) उन पर कुछ अन्य संचालन करना चाहते हैं।

उदाहरण के लिए:

var procs = System.Diagnostics.Process.GetProcesses().Select(p => new { p.Id, p.ProcessName}); 
foreach(var p in procs) 
{ 
    Console.WriteLine("{0}: {1}", p.Id, p.ProcessName); 
} 
+0

मुझे अक्सर इन परिस्थितियों में लगता है कि मेरे पास पहले से ही एक ऑब्जेक्ट है जिसे मैं चुन रहा हूं। मैं पूरी ऑब्जेक्ट का चयन क्यों नहीं करूंगा जब तक कि यह शामिल नहीं होता()? –

+0

प्रक्षेपण (एनन क्लास) पर इटरेटिंग उन संपत्तियों को ले जाने से कम महंगी हो सकती है जिनकी आपको परवाह नहीं है। –

+0

समझ में आता है। धन्यवाद! –

1

मैं datagrids या DataViews कि प्रश्नों का औचित्य नहीं रह ही डेटा वापस से स्तंभ पर निर्भर में संतोषजनक क्षेत्रों में हाल ही में उन लोगों के साथ अच्छे भाग्य की भी पड़ा है। उदाहरण के लिए, कभी-कभी डेटा स्रोत सामान्यीकृत किए जाते थे या फ़ील्ड का नाम विभिन्न कारणों से बदला जाता था। अज्ञात प्रकारों को 'फ्रंट एंड' के रूप में लौटने वाली LINQ क्वेरी का उपयोग करके हम उत्पादन में exisitng ग्रिड रखने में सक्षम हैं।

+0

मौजूदा ग्रिड उत्पादन में रखे जाते हैं क्योंकि गुमनाम प्रकारों में वही गुण/इंटरफ़ेस होता है जो पुराने डेटा ने किया था? –

+0

हां - विशिष्ट कॉलम वाले डेटासेट में वापस आने वाले प्रश्न। समय के साथ उन स्तंभों को बदल दिया गया या वस्तुओं को समान कार्यक्षमता प्रदान करने के लिए लागू किया गया था लेकिन उसी संपत्ति के नाम के बिना। इन वस्तुओं के संग्रह से चयन करना एनन प्रकारों पर प्रक्षेपित करना हमें ग्रिड के साथ पकाने से रोकता है। – n8wrl

2

एक मामला जिसे मैंने अज्ञात प्रकार का उपयोगी पाया है, जेएसओएन को ऑब्जेक्ट्स को क्रमबद्ध करने और उन्हें एएसपी.नेट एमवीसी कार्यों में लौटने में है। आप जरूरी नहीं कि किसी ऑब्जेक्ट के सभी गुणों को वापस करना चाहते हैं और एक अनाम प्रकार आपको इससे मदद कर सकता है ..

[AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult Person(int id) 
    { 
     Person person = manager.GetPersonById(id); 
     if(Request.IsAjaxRequest()) 
      return Json(new {Name=person.Name, Age=person.Age,...}); 
     else 
      ... 
    } 
संबंधित मुद्दे