2010-06-23 7 views
11

मैं एक अंतरफलक IEntityएक इंटरफ़ेस पर मुक्केबाजी रूपांतरण कास्टिंग कर रहा है?

public interface IEntity{ 
    bool Validate(); 
} 

है और यदि ऐसा नहीं है एक मैं एक वर्ग कर्मचारी जो इस इंटरफेस

public class Employee : IEntity{ 
    public bool Validate(){ return true; } 
} 

अब अगर मैं निम्नलिखित कोड

Employee emp1 = new Employee(); 
IEntity ent1 = (IEntity)emp1; // Is this a boxing conversion? 

है लागू करता है मुक्केबाजी रूपांतरण तो कलाकार कैसे काम करता है?

+0

इस मामले में, कलाकारों की आवश्यकता नहीं है। कर्मचारी आईईएनटीटी इंटरफ़ेस लागू करता है, ताकि आप स्पष्ट रूप से एक स्पष्ट कलाकार की आवश्यकता के बिना कर्मचारी के किसी संदर्भ (आईईएनटीटी इंटरफ़ेस को लागू करने के बाद) के लिए आईईएनटीटी (आपके उदाहरण में ent1) को संदर्भित कर सकें। – Alan

उत्तर

16

नहीं, चूंकि Employee एक वर्ग है, जो value type के बजाय reference type है।

MSDN से:

मुक्केबाजी किसी भी इंटरफ़ेस इस मान प्रकार द्वारा कार्यान्वित प्रकार प्रकार वस्तु के लिए या करने के लिए एक मान प्रकार परिवर्तित करने की प्रक्रिया है। जब सीएलआर बॉक्स प्रकार का मानता है, तो यह सिस्टम के अंदर मान को लपेटता है। इसे प्रबंधित ढेर पर संग्रहीत करें और स्टोर करें। Unboxing ऑब्जेक्ट से मान प्रकार निकालता है।

उपर्युक्त एमएसडीएन लिंक में ऐसे उदाहरण हैं जो विषय को स्पष्ट करने में मदद कर सकते हैं।

+0

संभवतः इस तथ्य को स्पष्ट करने के लायक है कि यद्यपि यह वास्तविक उदाहरण में नहीं है, ओपी दिखाता है, यह * एक अलग स्थिति में हो सकता है। –

0

नहीं, ऐसा नहीं है।

कर्मचारी का आपका उदाहरण पहले से ही एक संदर्भ प्रकार है। संदर्भ प्रकार ढेर पर संग्रहीत हैं, इसलिए इसे बॉक्स किए गए/अनबॉक्स किए जाने की आवश्यकता नहीं है।

मुक्केबाजी केवल तब होता है जब आप ढेर या MSDN भाषा में, पर एक मान प्रकार की दुकान, आप कह सकते हैं:

मुक्केबाजी प्रकार करने के लिए एक मूल्य प्रकार (सी # संदर्भ) के एक अंतर्निहित रूपांतरण है वस्तु या किसी भी इंटरफ़ेस प्रकार इस मान प्रकार द्वारा लागू किया गया। बॉक्सिंग एक मान प्रकार ढेर पर उदाहरण ऑब्जेक्ट आवंटित करता है और मान को नई ऑब्जेक्ट में कॉपी करता है।

0

नहीं, मुक्केबाजी तब होती है जब आप किसी मान प्रकार को किसी ऑब्जेक्ट में परिवर्तित करते हैं।

+0

मुझे लगता है कि आपके संक्षिप्त उत्तर में पहले शब्द के बाद आपका मतलब अल्पविराम है। इसके बिना - यही है, जैसा कि आपका उत्तर वर्तमान में खड़ा है - इसका विपरीत अर्थ है, और इस प्रकार गलत है। –

0

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

8

उपरोक्त आपके उदाहरण में, कभी-कभी हां नहीं।

बॉक्सिंग "मुक्केबाजी" की प्रक्रिया एक संदर्भ प्रकार में एक मूल्य प्रकार है; एक संदर्भ प्रकार। उपरोक्त आपके उदाहरण में, कर्मचारी पहले से ही एक संदर्भ प्रकार है, इसलिए जब आप इसे आईएनटीटीटी में डालते हैं तो यह बॉक्स बॉक्स नहीं होता है।

हालांकि, कर्मचारी एक मूल्य प्रकार था, जैसे संरचना (कक्षा के बजाए), फिर हां।

2

सं।

क्योंकि emp1 एक संदर्भ प्रकार है।

बॉक्सिंग तब होती है जब किसी मान प्रकार को ऑब्जेक्ट में परिवर्तित किया जाता है, या एक इंटरफ़ेस प्रकार होता है।

4

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

public interface IEntity { 
    bool Validate(); 
} 

public class EmployeeClass : IEntity { 
    public bool Validate() { return true; } 
} 

public struct EmployeeStruct : IEntity { 
    public bool Validate() { return true; } 
} 


//Boxing: A NEW reference is created on the heap to hold the struct's memory. 
//The struct's instance fields are copied into the heap. 
IEntity emp2 = new EmployeeStruct(); //boxing 

//Not considered boxing: EmployeeClass is already a reference type, and so is always created on the heap. 
//No additional memory copying occurs. 
IEntity emp1 = new EmployeeClass(); //NOT boxing 

//unboxing: Instance fields are copied from the heap into the struct. 
var empStruct = (EmployeeStruct)emp2; 
//empStruct now contains a full shallow copy of the instance on the heap. 


//no unboxing. Instance fields are NOT copied. 
var empClass = (EmployeeClass)emp2; //NOT unboxing. 
//empClass now points to the instance on the heap. 
संबंधित मुद्दे

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