2009-08-18 6 views
21

सी # 4 में एक नया dynamic कीवर्ड होगा जो गतिशील भाषा सुविधाओं को सी # में लाएगा।आप सी # 4 गतिशील प्रकार का उपयोग कैसे करेंगे?

आप इसे अपने कोड में उपयोग करने की योजना कैसे बनाते हैं, आप किस पैटर्न का प्रस्ताव देंगे? आपके वर्तमान प्रोजेक्ट के किस हिस्से में यह आपके कोड को क्लीनर या सरल बना देगा, या उन चीज़ों को सक्षम करेगा जो आप आसानी से नहीं कर सकते हैं (आयरन रूबी या आयरनपीथन जैसे गतिशील भाषाओं के साथ स्पष्ट इंटरऑप के बाहर)?

पीएस: कृपया अगर आपको यह सी # 4 अतिरिक्त पसंद नहीं है, तो टिप्पणियों को नकारात्मक रूप से बुलाने से बचें।

संपादित करें: प्रश्न को दोबारा शुरू करें।

गतिशील के क्लासिक उपयोग स्टैक ओवरफ्लो सी # उपयोगकर्ताओं द्वारा सबसे अच्छी तरह से जाना जाता है। मैं क्या जानना चाहता हूं कि यदि आप विशिष्ट नए सी # पैटर्न के बारे में सोचते हैं जहां सी # भावना को खोए बिना गतिशील रूप से लीवरेज किया जा सकता है।

+0

डुप्लिकेट प्रश्न? Http://stackoverflow.com/questions/244302/what-do-you-think-of-the-new-c-4-0- गतिशील- कीवर्ड – Lazarus

+0

वास्तव में नहीं ... सवाल यह नहीं है कि 'आपको पसंद है यह? लेकिन आप इसके साथ क्या करेंगे। लेकिन यह सच है कि यह काफी करीब है। मैंने एक समान प्रश्न पर एक खोज की लेकिन इस पर ठोकर खाई नहीं। – thinkbeforecoding

+3

यह कोई "सही" उत्तर के साथ एक चर्चा है। इसलिए, यह एक समुदाय विकी होना चाहिए। – ryeguy

उत्तर

1

मैं इसे अपने कोड को सरल बनाने के लिए उपयोग करूंगा जो COM/Interop से संबंधित है, जहां पहले मुझे सदस्य को आमंत्रित करने के लिए निर्दिष्ट करना था, इसके पैरामीटर इत्यादि। (मूल रूप से जहां संकलक को फ़ंक्शन के अस्तित्व के बारे में पता नहीं था और मैं संकलन समय पर इसका वर्णन करने की आवश्यकता है)। गतिशील के साथ यह कम बोझिल हो जाता है और कोड दुबला हो जाता है।

+0

एक्सेलेंट ब्लॉग एंट्री और कोड जो इंटरऑप को सरल बनायेगा, बहुत कुछ यहां पाया जा सकता है: http://tirania.org/blog/archive/2009/Aug-11.html – Yakeen

12

जहां भी पुरानी शैली का प्रतिबिंब अब उपयोग किया जाता है और कोड पठनीयता अक्षम हो गई है। और, जैसा कि आप कहते हैं, कुछ इंटरऑप परिदृश्य (मैं कभी-कभी COM के साथ काम करता हूं)।

यह बहुत अधिक है। यदि dynamic उपयोग से बचा जा सकता है, तो इसे टालना चाहिए। संकलन समय जांच, प्रदर्शन, आदि

कुछ हफ्ते पहले, मुझे this article याद आया। जब मैंने इसे पहली बार पढ़ा, तो मैं स्पष्ट रूप से चिंतित था। लेकिन मुझे जो एहसास नहीं हुआ था वह यह है कि मुझे नहीं पता था कि किसी अज्ञात प्रकार पर ऑपरेटर का उपयोग कैसे करें।

dynamic c = 10; 
int b = c * c; 

नियमित परावर्तन का उपयोग करके आप परिभाषित ऑपरेटरों का उपयोग नहीं कर सकते हैं: मैं सोच क्या उत्पन्न कोड कुछ इस तरह के लिए होगा शुरू कर दिया। Microsoft नेमस्पेस से कुछ सामानों का उपयोग करके, यह काफी कोड उत्पन्न हुआ। आइए बस उपर्युक्त कोड पढ़ने के लिए बहुत आसान है :) यह अच्छा है कि यह काम करता है, लेकिन यह भी बहुत धीमा था: नियमित गुणा (डीओएच) से लगभग 10,000 गुना धीमा, और ICalculator इंटरफ़ेस से लगभग 100 गुना धीमा एक गुणा विधि के साथ।

संपादित - उत्पन्न कोड, उन दिलचस्पी के लिए:

if (<Test>o__SiteContainer0.<>p__Sitea == null) 
    <Test>o__SiteContainer0.<>p__Sitea = 
    CallSite<Func<CallSite, object, object, object>>.Create(
     new CSharpBinaryOperationBinder(ExpressionType.Multiply, 
     false, false, new CSharpArgumentInfo[] { 
      new CSharpArgumentInfo(CSharpArgumentInfoFlags.None, null), 
      new CSharpArgumentInfo(CSharpArgumentInfoFlags.None, null) })); 
b = <Test>o__SiteContainer0.<>p__Site9.Target(
     <Test>o__SiteContainer0.<>p__Site9, 
     <Test>o__SiteContainer0.<>p__Sitea.Target(
     <Test>o__SiteContainer0.<>p__Sitea, c, c)); 
+0

मैं उन मामलों के बारे में सोचता हूं जहां प्रतिबिंब का उपयोग गतिशील द्वारा प्रतिस्थापित किया जा सकता है कोड, आप एक नमूना दे सकते हैं? – thinkbeforecoding

+0

@ थिंक: यह उन मामलों में उपयोग किया जा सकता है जहां कार्यों को प्रतिबिंबित किया जा रहा है, न कि जहां प्रतिबिंब का उपयोग सुलभता को बाईपास करने के लिए किया जा रहा है (जब तक मुझे लगता है कि, आप इसे पहले किसी ऑब्जेक्ट पर नहीं डालते हैं? सुनिश्चित नहीं है ...) या निरीक्षण करने के लिए । –

7

डायनामिक कीवर्ड सब के बारे में दो स्थितियों के लिए आवश्यक कोड सरलीकृत कर रहा है: इंटरॉप कॉम के लिए

  • सी #
  • सी # गतिशील भाषा (जावास्क्रिप्ट, इत्यादि) इंटरऑप

जबकि उन परिदृश्यों के बाहर उपयोग किया जा सकता है, तो शायद नहीं होना चाहिए।

+0

क्या आपको अपने दूसरे बिंदु के बारे में अधिक जानकारी मिली है कृपया स्कॉट करें? एक सी # प्रबंधित गेम इंजन - एक अजाक्स ग्राफिक्स इंजन को उजागर करना कुछ ऐसा है जो मैं काम कर रहा हूं और यह देखना अच्छा लगेगा कि इससे कैसे मदद मिलेगी! – divinci

4

Miguel de Icaza अपने ब्लॉग पर एक बहुत ही शांत उपयोग के मामले प्रस्तुत किया, here (स्रोत शामिल है):

dynamic d = new PInvoke ("libc"); 
d.printf ("I have been clicked %d times", times); 

यदि यह एक सुरक्षित और विश्वसनीय तरीके से ऐसा करना संभव है, कि देशी के लिए भयानक होगा कोड इंटरऑप।

3

यह भी हमें जा रहा है, बहु प्रेषण के रूप में कुछ मामलों में आगंतुक पैटर्न का उपयोग करने के लिए अब संभव हो जाएगा

public class MySpecialFunctions 
{ 
    public void Execute(int x) {...} 
    public void Execute(string x) {...} 
    public void Execute(long x) {...} 
} 

dynamic x = getx(); 
var myFunc = new MySpecialFunctions(); 
myFunc.Execute(x); 

... रनटाइम पर सबसे अच्छा तरीका मैच कॉल करेंगे होने के बजाय से बचने के लिए अनुमति देगा संकलन समय

+0

कृपया मुझे लाभ को समझने में मेरी सहायता करें। संकलन समय पर आप इसे क्यों हल नहीं करना चाहते हैं? – Jake

+0

कभी-कभी आप नहीं जानते कि आप किस प्रकार के साथ काम कर रहे हैं - उदाहरण के लिए आप बेसक्लास के साथ काम कर रहे हैं लेकिन उपप्रकारों के लिए विशेष व्यवहार की आवश्यकता है। जब पेड़ की संरचना को स्थानांतरित किया जाता है, तो प्रत्येक नोड बेस क्लास नोड से वंचित हो सकता है, लेकिन नोड को संसाधित करते समय आपको उपप्रकार (यानी समग्र नोड) के लिए विशिष्ट व्यवहार की आवश्यकता होती है। आप MySpecialFunctions जैसे क्लास का उपयोग कर सकते हैं और बिना किसी स्विच के निष्पादन को कॉल कर सकते हैं/यदि ब्लॉकों को नोड के प्रकार की जांच करके कॉल करने के लिए कौन सी विधि कॉल करने की कोशिश की जा रही है। क्लाइंट कोड को MySpecialFunctions का सही उपयोग करने के लिए सभी उपप्रकारों से अवगत नहीं होना चाहिए – saret

+0

MySpecialFunctions के नए/वैकल्पिक उपप्रकारों को क्लाइंट कोड प्रोसेसिंग नोड्स में परिवर्तन की आवश्यकता नहीं होगी। – saret

5

हाल ही में मैंने सी # 4.0 में गतिशील प्रकारों के बारे में ब्लॉग किया है और अन्य लोगों के बीच मैंने इसके कुछ संभावित उपयोगों के साथ-साथ इसके कुछ नुकसान का भी उल्लेख किया है। यह लेख यहां फिट होने के लिए थोड़ा बड़ा है, लेकिन आप इसे address पर पूरी तरह से पढ़ सकते हैं।

  • एक यादृच्छिक XML या JSON एक गतिशील सी # वस्तु में पढ़ने:

    एक सारांश के रूप में, यहाँ कुछ उपयोगी उपयोग के मामलों (COM पुस्तकालयों और IronPython की तरह गतिशील भाषाओं के साथ interoping के स्पष्ट एक को छोड़कर) कर रहे हैं। .NET ढांचे में सी # ऑब्जेक्ट्स में एक्सएमएल और जेएसओएन दस्तावेजों को आसानी से deserializing के लिए कक्षाओं और विशेषताओं शामिल हैं, लेकिन केवल अगर उनकी संरचना स्थिर है। यदि वे गतिशील हैं और आपको रनटाइम पर अपने फ़ील्ड को खोजने की ज़रूरत है, तो उन्हें गतिशील वस्तुओं में केवल deserialized किया जा सकता है। .Net डिफ़ॉल्ट रूप से इस कार्यक्षमता की पेशकश नहीं करता है, लेकिन यह jsonfx या DynamicJson

  • विधियों से अनाम प्रकारों को वापस करने के द्वारा किया जा सकता है। बेनामी प्रकारों का तरीका उन तरीकों से सीमित होता है जहां उन्हें परिभाषित किया जाता है, लेकिन इसे गतिशील की सहायता से दूर किया जा सकता है। बेशक, यह एक खतरनाक चीज है, क्योंकि आप एक गतिशील संरचना (बिना किसी संकलन समय जांच के) के साथ वस्तुओं का पर्दाफाश करेंगे, लेकिन यह कुछ मामलों में उपयोगी हो सकता है। उदाहरण के लिए निम्न विधि एसक्यूएल को LINQ का उपयोग एक डीबी मेज से केवल दो कॉलम पढ़ता है और परिणाम देता है:

    public static List<dynamic> GetEmployees() 
    { 
        List<Employee> source = GenerateEmployeeCollection(); 
        var queyResult = from employee in source 
           where employee.Age > 20 
           select new { employee.FirstName, employee.Age }; 
    
        return queyResult.ToList<dynamic>(); 
    } 
    
  • बाकी WCF सेवाओं है कि गतिशील डेटा रिटर्न पैदा करते हैं। यह निम्नलिखित परिदृश्य में उपयोगी हो सकता है। ध्यान दें कि आपके पास एक वेब विधि है जो उपयोगकर्ता से संबंधित डेटा लौटाती है। हालांकि, आपकी सेवा उपयोगकर्ताओं के बारे में बहुत सारी जानकारी का खुलासा करती है और यह हर समय उन्हें सभी को वापस करने में सक्षम नहीं होगी। यह बेहतर होगा कि आप उपभोक्ताओं क्षेत्रों कि वे वास्तव में, जरूरत है निम्नलिखित यूआरएल के साथ की तरह निर्दिष्ट करने के लिए अनुमति देने के लिए सक्षम हो जाएगा

    http://api.example.com/users?userId=xxxx&fields=firstName,lastName,age 
    

    समस्या तो तथ्य यह है कि WCF केवल ग्राहकों बाहर कर दिया प्रतिक्रियाओं पर लौट जाएँगे से आता है धारावाहिक वस्तुओं का। यदि वस्तु स्थिर हैं तो गतिशील प्रतिक्रियाओं को वापस करने का कोई तरीका नहीं होगा, इसलिए गतिशील प्रकारों का उपयोग करने की आवश्यकता है। हालांकि यहां एक आखिरी समस्या है और यह है कि डिफ़ॉल्ट गतिशील प्रकार से क्रमिक नहीं हैं। article में एक कोड नमूना है जो दिखाता है कि इसे कैसे दूर किया जाए (फिर से, मैं इसे इसके आकार के कारण यहां पोस्ट नहीं कर रहा हूं)।

अंत में, आप देख सकते हैं कि मैंने उपयोग किए गए दो उपयोग मामलों में कुछ वर्कअराउंड या तृतीय पक्ष टूल की आवश्यकता है। इससे मुझे लगता है कि नेट टीम ने ढांचे में एक बहुत ही अच्छी सुविधा जोड़ दी है, लेकिन हो सकता है कि उन्होंने इसे केवल COM और गतिशील भाषाओं के साथ जोड़ दिया हो।यह शर्म की बात होगी क्योंकि गतिशील भाषाओं में कुछ मजबूत फायदे हैं और उन्हें एक मंच पर उपलब्ध कराया जाता है जो उन्हें मजबूत टाइप की गई भाषाओं की ताकत के साथ जोड़ता है, शायद अन्य विकास प्लेटफॉर्म से पहले नेट और सी # डाल देगा।

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