2012-02-20 15 views
10

में होता है मुझे यह जानकर उत्सुकता है कि क्या सी # परिणाम में मुक्केबाजी में सभी कास्ट होता है, और यदि नहीं, तो क्या सभी एक महंगी ऑपरेशन करते हैं?क्या सभी सी # का परिणाम मुक्केबाजी/अनबॉक्सिंग

उदाहरण से Boxing and Unboxing (C# Programming Guide)

int i = 123; 
    // The following line boxes i. 
    object o = i; 

लिया यह पंक्ति स्पष्ट रूप से मुक्केबाजी (एक वस्तु के रूप पूर्णांक प्रकार लपेटकर) का कारण बनता है। यह एक ऐसा ऑपरेशन है जिसे महंगा माना जाता है, क्योंकि यह कचरा बनाता है जिसे एकत्र किया जाएगा।

2 अलग-अलग प्रकार के संदर्भ प्रकारों के बारे में क्या है? उसकी कीमत क्या है? क्या इसे ठीक से मापा जा सकता है? (पिछले उदाहरण की तुलना में)

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

public class A 
{ 
} 

public class B : A 
{ 
} 

var obj = new B(); 
var obj2 = (A)obj; // is this an "expensive" operation? this is not boxing 
+8

एक संदर्भ प्रकार से दूसरे में कास्टिंग करते समय कोई मुक्केबाजी शामिल नहीं है। – BrokenGlass

+0

क्या यह उचित माप योग्य है? क्या इससे बचा जाना चाहिए? –

+0

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

उत्तर

22

मुझे पता है कि अगर मुक्केबाजी में सी # परिणाम में सभी रूपांतरणों।

नहीं। केवल मुक्केबाजी रूपांतरण मुक्केबाजी में परिणाम उत्सुक हूँ, इसलिए नाम" मुक्केबाजी रूपांतरण "। मुक्केबाजी रूपांतरण सभी अंतर्निहित हैं मूल्य प्रकारों से संदर्भ प्रकारों में रूपांतरणों में - या तो उस वर्ग के लिए जो मान प्रकार से प्राप्त होता है, या जो इंटरफ़ेस लागू होता है। (या इंटरफ़ेस के साथ संगत इंटरफ़ेस में यह एक कॉन्वेंट या contravariant संदर्भ रूपांतरण के माध्यम से लागू होता है।)

सभी कनवर्टर हैं सायन एक महंगा ऑपरेशन?

नहीं। पहचान रूपांतरण शून्य लागत है क्योंकि संकलक उन्हें पूरी तरह से बढ़ा सकता है।

निहित और स्पष्ट संदर्भ रूपांतरणों की लागत क्या हैं?

लागू संदर्भ रूपांतरण शून्य लागत हैं। कंपाइलर उन्हें पूरी तरह से elide कर सकते हैं। यही है, जिराफ से अपने मूल प्रकार के पशु, या जिराफ से इसके कार्यान्वित इंटरफ़ेस प्रकार IAmatallMammal में परिवर्तित, निःशुल्क हैं।

स्पष्ट संदर्भ रूपांतरण में एक रनटाइम चेक शामिल है यह सत्यापित करने के लिए कि वास्तव में संदर्भ वांछित प्रकार की वस्तु का संदर्भ देता है।

चाहे वह रनटाइम चेक "महंगा" है या नहीं, आपके बजट पर निर्भर करता है।

क्या लागत ठीक से मापा जा सकता है?

निश्चित रूप से। तय करें कि कौन सा संसाधन आपके लिए प्रासंगिक है - समय, कहें - और फिर स्टॉपवॉच के साथ समय की अपनी खपत को ध्यान से मापें।

एक सवाल आप शायद नहीं पूछा लेकिन होना चाहिए:

सबसे महंगी रूपांतरण क्या हैं?

उपयोगकर्ता परिभाषित रूपांतरण विधि कॉल के लिए सिंटैक्टिक चीनी से अधिक कुछ नहीं हैं; वह विधि किसी भी विधि की तरह मनमाने ढंग से लंबी लग सकती है।

डायनामिक रूपांतरण रनटाइम पर फिर से कंपाइलर शुरू करते हैं; संकलक एक प्रकार का विश्लेषण करने के लिए मनमाने ढंग से लंबा ले सकता है, इस पर निर्भर करता है कि आप जिस विश्लेषण समस्या को फेंकने के लिए चुनते हैं, उस पर निर्भर करता है।

+1

एरिक के बारे में चिंतित से अधिक कैसे काम करता है, प्रोग्रामर द्वारा स्पष्ट किए गए एक निहित रूपांतरण के बारे में क्या? मुझे लगता है कि संकलक द्वारा भी elided। (उदाहरण: 'var o = (ऑब्जेक्ट)" कुछ स्ट्रिंग "; वापसी o.GetHashCode();') – phoog

+2

@phoog: सही। इसके लिए आईएल उत्पन्न करने की कोई आवश्यकता नहीं है; स्ट्रिंग संदर्भ पहले ही असाइनमेंट-चर के साथ संगत है। –

10

सं

मुक्केबाजी एक नया संदर्भ प्रकार उदाहरण में एक मूल्य डालने का मतलब है।

संदर्भ प्रकारों के बीच मानक स्थानों में कोई आवंटन नहीं होता है।
(उपयोगकर्ता-परिभाषित डाले कुछ भी कर सकते)

+0

"एक संदर्भ प्रकार से कास्टिंग किसी भी आवंटन के परिणामस्वरूप नहीं होता है।" जरूरी नहीं है। – jason

+0

@ जेसन: स्पष्ट – SLaks

+0

डाउनवोट हटा दिया गया। – jason

7

मैं अगर सब मुक्केबाजी में सी # परिणाम में डाले जानने के लिए उत्सुक हूँ,

सं मुक्केबाजी एक very special operation एक का एक उदाहरण के इलाज का मतलब है कि है संदर्भ प्रकार के उदाहरण के रूप में मान प्रकार। संदर्भ प्रकार रूपांतरण के लिए संदर्भ प्रकार रूपांतरण के लिए, अवधारणा कोई भूमिका निभाती है।

सभी एक महंगी ऑपरेशन करते हैं?

लघु जवाब: नहीं

लांग जवाब: महंगा परिभाषित करें। फिर भी नहीं, हालांकि।

2 अलग-अलग प्रकार के संदर्भ प्रकारों के बारे में क्या है? उसकी कीमत क्या है?

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

अन्य, उपयोगकर्ता द्वारा परिभाषित रूपांतरण, "धीमे" हो सकते हैं, वे "तेज़" हो सकते हैं।

यह एक "धीमा" है।

class A { public int Foo { get; set; } } 
class B { 
    public int Foo { get; set; } 
    static Random rg = new Random(); 
    static explicit operator A(B b) { 
     Thread.Sleep(rg.Next()); 
     return new A { Foo = b.Foo; } 
    } 
} 

यह एक "तेज़" है।

class A { public int Foo { get; set; } } 
class B { 
    public int Foo { get; set; } 
    static Random rg = new Random(); 
    static explicit operator A(B b) { 
     return new A { Foo = b.Foo; } 
    } 
} 

var obj2 = (A)obj; // यह एक "महंगा" ऑपरेशन है? यह मुक्केबाजी नहीं है

नहीं, यह "सस्ता है।"

+0

महंगा ऑपरेशन का मतलब है == यदि मेरे पास एक एल्गोरिदम है जिसमें लूपिंग + कास्टिंग (कोई मुक्केबाजी नहीं) शामिल है, तो इसे अलग-अलग डिजाइन करना बुद्धिमानी है, या यह एक छोटा सा ऑपरेशन है जिसे प्रदर्शन-महंगा नहीं माना जाता है (निष्पादन समय के मामले में) –

+0

@liortal: यह निर्भर करता है। यदि आप प्रदर्शन के बारे में चिंतित हैं, तो इसे मापें। – SLaks

+0

मुझे यह समझने में दिलचस्पी है कि यह विशेष रूप से एक प्रदर्शन हिट –

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