2008-09-19 12 views
6

Wikipedia से:सी # और वीबी जेनेरिक क्यों हैं? वे क्या लाभ प्रदान करते हैं? जेनेरिक्स, FTW

जेनेरिक प्रोग्रामिंग कंप्यूटर प्रोग्रामिंग, जिसमें एल्गोरिदम होने वाली है-निर्दिष्ट-बाद में प्रकार के होते हैं के संदर्भ में लिखा जाता है की एक शैली है तो instantiated जब के लिए आवश्यक पैरामीटर के रूप में प्रदान किए गए विशिष्ट प्रकार और1 9 83 में दिखाई दिए। इस दृष्टिकोण सामान्य कार्यों को लिखने की अनुमति देता है या प्रकार जो केवल प्रकारों के सेट में भिन्न होते हैं, जिनका उपयोग करते समय वे संचालित होते हैं, इस प्रकार नकल को कम करता है।

जेनिक्स बाद में निर्दिष्ट प्रकारों को परिभाषित करने की क्षमता प्रदान करते हैं। आपको वस्तुओं का उपयोग करने के लिए उन्हें किसी प्रकार पर डालना नहीं है क्योंकि वे पहले ही टाइप किए गए हैं।

क्यों सी # और वीबी जेनेरिक्स है? वे क्या लाभ प्रदान करते हैं? आप उनका उपयोग करके क्या लाभ प्राप्त करते हैं?

अन्य भाषाओं में जेनेरिक भी हैं?

उत्तर

6

सी # और वीबी जेनरिक अंतर्निहित CLR में जेनरिक समर्थन का लाभ लेने के लिए है (या दूसरी तरह के आसपास है?)। वे आपको कोड इना स्थिर टाइप भाषा है कि प्रत्येक प्रकार आप (क्रम करना होगा कि आप के लिए) या अन्यथा उपयोग करने के लिए उन्हें इस्तेमाल के लिए कोड को फिर से लिखने के बिना प्रकार के एक से अधिक प्रकार के लिए आवेदन कर सकते हैं लिखने की अनुमति System.Object और हर जगह कास्टिंग (जैसे हमें ArrayList के साथ करना था)।

आप article पढ़ा था?

  • (टेम्पलेट्स के माध्यम से)
  • एफिल
  • डी (टेम्पलेट्स के माध्यम से)

    • सी ++
    • एडीए (टेम्पलेट्स के माध्यम से):

      ये भाषायें भी जेनरिक है हास्केल

    • जावा
  • +0

    जेनेरिक और टेम्पलेट्स के बीच कुछ अंतर है। सी ++, एडा और डी बाद वाले हैं, बाकी के बारे में निश्चित नहीं हैं। – BCS

    +2

    टेम्पलेट्स अभी भी अन्य सामान के अलावा जेनरिक के साथ लिखने की अनुमति देते हैं। –

    0

    आम उदाहरण संग्रह है। जैसे प्रकार टी का एक सेट, एक जोड़ें (टी) विधि और एक टी प्राप्त() विधि के रूप में। वही कोड, विभिन्न प्रकार के सुरक्षित संग्रह।

    सी ++, डी, एडीए और दूसरों टेम्पलेट्स, जेनरिक है कि यह थोड़ा अलग बग (और फिर कुछ) एक ही अंतिम परिणाम मिलता है के एक सुपरसेट।

    IIRC जावा जेनरिक है, लेकिन मैं जावा नहीं करते हैं।

    0

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

    0

    जावा में जेनेरिक भी हैं। सी ++ टेम्पलेट्स है।

    पर्ल और जावास्क्रिप्ट जैसी गतिशील भाषाओं में समान प्रकार के प्रतिबंध नहीं हैं, इसलिए उन्हें कम काम के साथ अधिकतर लाभ मिलते हैं।

    +0

    लाभ नहीं, क्योंकि वे किसी भी प्रकार की सुरक्षा प्रदान नहीं करते हैं। – Thomas

    +0

    सुरक्षा सुरक्षा से सामान्य संग्रह के लिए बहुत अधिक लाभ है। – Wedge

    2

    MSDN से:

    जेनेरिक्स आम भाषा क्रम के पुराने संस्करणों में एक सीमा का हल और सी # जिस भाषा में सामान्यीकरण के प्रकार के कास्टिंग और सार्वभौमिक से द्वारा पूरा किया है प्रदान करते हैं आधार प्रकार वस्तु। एक सामान्य वर्ग बनाकर, आप संकलन-समय पर टाइप-सुरक्षित संग्रह बना सकते हैं।

    जेनिक्स आपके कोड की पठनीयता और प्रदर्शन को बेहतर बनाने में कुछ उदाहरण देखने के लिए उस लेख के बाकी हिस्सों को पढ़ें।

    5

    व्यक्तिगत रूप से, मुझे लगता है कि वे बहुत समय बचा सकते हैं। मैं अभी भी .NET Framework 1.1 का उपयोग कर रहा हूं और हर बार जब आप एक विशिष्ट संग्रह चाहते हैं, तो आपको कलेक्शनबेस लागू करके दृढ़ता से टाइप किया गया संग्रह बनाना होगा। जेनेरिक के साथ, आपको बस अपने संग्रह को List<MyObject> की घोषणा करने की आवश्यकता है और यह हो गया है।

    2

    शायद उनके लिए सबसे आम उपयोग ArrayLists जोरदार टाइप कर रहा है। .NET 1.1 में, आपको या तो ऑब्जेक्ट से अपने वांछित प्रकार में सब कुछ डालना होगा, या दृढ़ता से टाइप किए गए ArrayList उत्पन्न करने के लिए कोडस्मिथ जैसे कुछ का उपयोग करना होगा।

    इसके अतिरिक्त, वे boxing को कम करने में मदद करते हैं। दोबारा, .NET 1.x में, यदि आपने एक वैल्यू टाइप के साथ एक ऐरेलिस्ट का उपयोग करने का प्रयास किया है, तो आप बॉक्सिंग को समाप्त कर देंगे और ऑब्जेक्ट को ऑब्जेक्ट कर सकते हैं। जेनेरिक आपको टाइप को परिभाषित करने से बचते हैं, भले ही संदर्भ या मान।

    उनके लिए अन्य आसान उपयोगों भी ईवेंट हैंडलर्स, LINQ प्रश्नों, आदि

    .NET में
    1

    जेनेरिक्स वस्तु संग्रह के लिए उत्कृष्ट रहे हैं कर रहे हैं। आप अपने ऑब्जेक्ट प्रकार को परिभाषित कर सकते हैं, हालांकि आप चाहते हैं और इसके लिए कोई कोड लिखने के बिना एक सूची, कहने में सक्षम हो सकते हैं, और टी.ई. के प्रकार के सुरक्षित होने के दौरान .NET सूची जेनेरिक संग्रह की सभी कुशल कार्यक्षमता तक पहुंच प्राप्त कर सकते हैं। उत्तम सामग्री।

    0

    उद्देश्य-सी में आप जेनरिक के उद्देश्यों को प्राप्त करने के लिए प्रोटोकॉल का उपयोग कर सकते हैं। चूंकि भाषा को कमजोर टाइप किया गया है, हालांकि, आमतौर पर यह चिंता का अधिक नहीं होता है क्योंकि जब आप कई प्रकार के लिए एक कोड पथ का उपयोग करने के लिए टाइप सिस्टम से लड़ रहे हैं।

    1

    जेनिक्स सी ++ में टेम्पलेट्स की अवधारणा पर निर्माण कर रहे हैं यदि आप उनसे परिचित हैं।

    एल्गोरिदम या डेटा संरचना को लागू करने का यह एक तरीका है लेकिन वास्तविक प्रकार में देरी का उपयोग इस पर किया जाता है।

    सूची को किसी भी प्रकार की अपनी पसंद int, स्ट्रिंग और यहां तक ​​कि कस्टम प्रकारों के साथ असाइन किया जा सकता है, जिस प्रकार सूची के निर्माण पर असाइन किया गया है। लेकिन आप सूची संचालन को हटाने आदि का उपयोग करने में सक्षम होंगे

    आप जेनेरिकों के लिए उपयोग करके बहुत सारे कोडिंग प्रयासों को वास्तव में सहेज सकते हैं। और आपको प्रकारों के बीच बॉक्स और अनबॉक्स नहीं होना चाहिए।

    जावा में जेनेरिक भी हैं। उन्हें वाइल्डकार्ड कहा जाता है।

    0

    व्यक्तिगत रूप से मैं जेनरिक्स का एक बड़ा प्रशंसक हूं क्योंकि मुझे जिस कोड को लिखना नहीं है।

    .net में

    What is Inversion of Control?

    1

    जेनेरिक्स, inheritence और विस्तार के तरीकों की तरह, कोड दोहराव की कमी के लिए अनुमति देता है। मुझे रिफैक्टरिंग के माध्यम से समझाएं।

    यदि एक सामान्य पूर्वजों के साथ सभी वर्गों में एक आम विधि होती है, तो कक्षा के सामान्य पूर्वजों (विरासत) में सामान्य विधि रखें।

    यदि कुछ वर्गों में एक सामान्य विधि है जो कुछ परिणाम प्राप्त करने के लिए सार्वजनिक अनुबंध का उपयोग करती है, तो सामान्य विधि को उस सार्वजनिक अनुबंध पर एक विस्तार विधि में बनाएं।

    यदि कुछ कई तरीकों या कक्षाओं में एक ही कोड है जो केवल प्रकार के प्रकार से अलग होता है (विशेष रूप से जहां प्रकार के विवरण विधि के संचालन के लिए प्रासंगिक नहीं हैं), उन तरीकों या कक्षाओं को सामान्य में एकत्र करें।

    1

    वे मूल्य प्रकारों का उपयोग करके संग्रह के प्रदर्शन को बढ़ाते हैं, क्योंकि कोई मुक्केबाजी/अनबॉक्सिंग की आवश्यकता नहीं होगी। वे उपयोग करने के लिए बहुत क्लीनर हैं क्योंकि आपको वांछित प्रकार में ऑब्जेक्ट (उदाहरण के लिए ऐरेलिस्ट का उपयोग करके) डालना नहीं होगा - और इसी प्रकार वे प्रकार की सुरक्षा को लागू करने में मदद करते हैं।

    3

    पर विचार करें इन विधि हस्ताक्षर:

    //Old and busted 
    public abstract class Enum 
    { 
        public static object Parse(Type enumType, string value); 
    } 
    //To call it: 
    MyEnum x = (MyEnum) Enum.Parse(typeof(MyEnum), someString); 
    

    //New and groovy 
    public abstract class Enum 
    { 
        public static T Parse<T>(string value); 
    } 
    
    //To call it: 
    MyEnum x = Enum.Parse<MyEnum>(someString); 
    

    देखो मा: नहीं क्रम प्रकार हेरफेर।

    +0

    मुझे देखो माँ पर आपकी टिप्पणी पसंद है। : डी – ferventcoder

    1

    सी # में गैर जेनेरिक प्रकारों पर जेनेरिक का सबसे बड़ा लाभ (जावा नहीं, जावा एक अलग कहानी है) यह है कि वे बहुत तेज हैं। जेआईटी सर्वश्रेष्ठ मशीन कोड उत्पन्न करता है जो इसे किसी दिए गए प्रकार के लिए आ सकता है। List<int> असल में चींटियों की एक सूची है और एक int लपेटने वाली पूर्णांक वस्तुओं नहीं है। यह जेनेरिक प्रकारों को तेजी से तेज़ बनाता है और सुरक्षित टाइप भी करता है जो संकलन समय पर आपको बहुत सारी त्रुटियों का पता लगाने में मदद कर सकता है :)

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