2011-01-11 14 views
6

किसी एक संदर्भ प्रकार"रेफरी" कीवर्ड और संदर्भ प्रकार अपनी टीम में

class A { /* ... */ } 

class B 
{  
    public void DoSomething(ref A myObject) 
    { 
     // ... 
    } 
} 

पर रेफरी कीवर्ड की एक अजीब उपयोग पर ठोकर खाई तो ऐसा कोई कारण किसी समझदार ऐसा होता है? मैं सी #

+0

भी देखें [इस सवाल] (http: // stackoverflow.com/questions/961717/c-what-is-the-use-of-ref-for-reference-type-variables)। –

+0

वास्तव में, मुझे खोज करते समय उस प्रश्न को याद आया। ओडेड किस बारे में बात कर रहा है, इसके स्पष्ट उदाहरण के लिए अच्छा पकड़ – Luk

उत्तर

12

चलो

class A 
{ 
    public string Blah { get; set; } 
} 

void Do (ref A a) 
{ 
    a = new A { Blah = "Bar" }; 
} 
तो

A a = new A { Blah = "Foo" }; 
Console.WriteLine(a.Blah); // Foo 
Do (ref a); 
Console.WriteLine(a.Blah); // Bar 

लेकिन अगर सिर्फ

void Do (A a) 
{ 
    a = new A { Blah = "Bar" }; 
} 
तो

A a = new A { Blah = "Foo" }; 
Console.WriteLine(a.Blah); // Foo 
Do (a); 
Console.WriteLine(a.Blah); // Foo 
+1

+1, भले ही यह पहले से ही स्पष्ट रूप से स्पष्ट हो। –

+0

बहुत बहुत धन्यवाद, जो इसे क्रिस्टल स्पष्ट बनाता है! – Luk

+0

@Luk: खुशी हुई यह मदद की! :) – abatishchev

15

केवल अगर वे वस्तु किसी दूसरे पर myObject के रूप में पारित करने के लिए संदर्भ बदलना चाहते में इसके लिए एक प्रयोग नहीं मिल रहा।

public void DoSomething(ref A myObject) 
{ 
    myObject = new A(); // The object in the calling function is now the new one 
} 

काफी संभावनाएँ हैं यह नहीं है कि वे क्या करना चाहते हैं और ref जरूरत नहीं है।

0

ref कीवर्ड उपयोगी है अगर विधि विधि में पारित चर में संग्रहीत संदर्भ को बदलना है। यदि आप ref का उपयोग नहीं करते हैं तो आप केवल संदर्भ को बदल नहीं सकते हैं, ऑब्जेक्ट स्वयं ही विधि के बाहर दिखाई देगा।

this.DoSomething(myObject); 
// myObject will always point to the same instance here 

this.DoSomething(ref myObject); 
// myObject could potentially point to a completely new instance here 
0

इसके साथ कुछ भी अनोखा नहीं है। यदि आप किसी विधि से कई मान वापस करना चाहते हैं या किसी तर्क के रूप में आपके द्वारा पारित ऑब्जेक्ट पर वापसी मान को पुन: असाइन नहीं करना चाहते हैं तो आप चर का संदर्भ देते हैं।

इस तरह

:

int bar = 4; 
foo(ref bar); 

के बजाय:

int bar = 4; 
bar = foo(bar); 

या यदि आप कई मूल्यों प्राप्त करना चाहते हैं:

int bar = 0; 
string foobar = ""; 
foo(ref bar, ref foobar); 
+0

वास्तव में, ओपी संदर्भ प्रकारों के बारे में बात कर रहा है, मूल्य प्रकार नहीं, जैसे 'int' – abatishchev

+0

तो आप कह रहे हैं कि संदर्भ मान प्रकारों के साथ उपयोग नहीं किया जाता है? – peterthegreat

+0

afaik, नहीं। मान प्रकार पूरी तरह से प्रतिलिपि बनाते हैं, यानी मूल्य से। यही कारण है कि उन्हें मूल्य प्रकार – abatishchev

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