2009-06-30 13 views
10

पर एक संदर्भ देता है, मैं वर्तमान में सी # में विंडोज प्रपत्रों के साथ काम कर रहा हूं। यह के दौरान, मैंने किया था निम्नलिखितसी # में ऑब्जेक्ट कास्टिंग करना हमेशा प्रारंभिक ऑब्जेक्ट

 void HideButtons(object sender, EventArgs e) 
    { 
     Button hider = ((Button)sender); 
     foreach(Button tohide in hider.Parent.Controls) 
      tohide.Hide(); 
     hider.Show(); 
     hider.Text = "UnHide"; 
     hider.Click -= new EventHandler(HideButtons); 
     hider.Click += new EventHandler(ShowButtons); 
    } 

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

अब, यह सब ठीक है और अच्छा है, सिवाय इसके कि, जैसा कि मैं संकलित करता हूं, मुझे लगता है कि मैंने खुद को महसूस किया है। हाइडर अपनी अनूठी वस्तु है, ((बटन) प्रेषक से वापसी)। यह आवश्यक रूप से प्रेषक का संदर्भ नहीं है, और यह कोड शायद कुछ भी नहीं करेगा।

लेकिन कम और देखें, यह ठीक वैसे ही काम करता है जैसा मैं चाहता था और शुरू में ऐसा लगता था। जो मुझे सोचने के लिए मिला, क्या एक कलाकार हमेशा मूल वस्तु का संदर्भ देता है? यदि नहीं, तो मैं उस (बटन) प्रेषक = प्रेषक की गारंटी कैसे दूं?

मुझे पता है कि युगल/ints के लिए ऐसा नहीं है, के रूप में

 public static int Main() 
    { 
     int a; 
     double b; 
     b = 10.5; 
     a = (int)b; 
     a++; 
     return 0; 
    } 

एक किया जा रहा है 11, और ख जा रहा है 10.5 लेकिन उस युगल/ints structs होने के कारण हो सकता है के साथ समाप्त होता है। यह व्यवहार मुझे चिंतित करता है, और यह जानना अच्छा होगा कि यह हमेशा एक संदर्भ वापस कर देगा ताकि मैं अपनी चिंता का मन आराम कर सकूं।

+0

उत्कृष्ट प्रश्न। यहां कुछ नोट्स दिए गए हैं जब एक कलाकार पहचान को संरक्षित बनाम प्रतिनिधित्व करता है। यह बहुत भ्रमित हो सकता है। http://blogs.msdn.com/ericlippert/archive/2009/03/19/representation-and-identity.aspx –

उत्तर

16

संदर्भ प्रकारों के लिए। अगर कास्ट विरासत पदानुक्रम ऊपर या नीचे है, तो हाँ। यह एक संदर्भ रूपांतरण है। सी # 3.0 भाषा कल्पना, खंड 6.2.4 से:

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

यह मामला है कि आप अपने WinForms कोड में उपयोग कर रहे हैं।

हालांकि, अन्य (अभी भी संदर्भ प्रकार) मामलों में यह उपयोगकर्ता परिभाषित रूपांतरण का आह्वान कर सकता है। उदाहरण के लिए:

using System; 

class Foo 
{ 
} 

class Bar 
{ 
    public static explicit operator Bar(Foo f) 
    { 
     return new Bar(); 
    } 
} 

class Test 
{ 
    static void Main() 
    { 
     Foo f = new Foo(); 
     Bar b = (Bar) f; 
     Console.WriteLine(object.ReferenceEquals(f, b)); // Prints False 
    } 
} 

उपयोगकर्ता-परिभाषित इस तरह रूपांतरण अपेक्षाकृत दुर्लभ हैं।

मूल्य प्रकारों के लिए, अन्य रूपांतरणों के साथ मुक्केबाजी और अनबॉक्सिंग रूपांतरण हैं (उदा। int और double के बीच)।

11

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

+0

मैं सी # के लिए नया हूं। क्या यह पता लगाने का कोई तरीका है कि पास ऑब्जेक्ट एक value_type या refernce_type है? – Naveen

+1

अगर (ओबीजे वैल्यू टाइप है) –

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