2010-04-25 14 views
5

यहां मेरी कक्षा है:रेफरी कीवर्ड का उपयोग कर परेशानी। बहुत नौसिखिया सवाल!

public class UserInformation 
    { 
     public string Username { get; set; } 
     public string ComputerName { get; set; } 
     public string Workgroup { get; set; } 

     public string OperatingSystem { get; set; } 
     public string Processor { get; set; } 
     public string RAM { get; set; } 
     public string IPAddress { get; set; } 

     public UserInformation GetUserInformation() 
     { 
      var CompleteInformation = new UserInformation(); 

      GetPersonalDetails(ref CompleteInformation); 
      GetMachineDetails(ref CompleteInformation); 

      return CompleteInformation; 
     } 

     private void GetPersonalDetails(ref UserInformation CompleteInformation) 
     { 

     } 

     private void GetMachineDetails(ref UserInformation CompleteInformation) 
     { 

     } 
    } 

मैं इस धारणा के तहत हूं कि रेफरी कीवर्ड कंप्यूटर को एक ही चर का उपयोग करने और एक नया निर्माण करने के लिए कहता है।

क्या मैं इसे सही तरीके से उपयोग कर रहा हूं? क्या मुझे कॉलिंग कोड लाइन और वास्तविक विधि कार्यान्वयन दोनों पर रेफरी का उपयोग करना है?

उत्तर

5

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

अपने उदाहरण में ref कीवर्ड का उपयोग करते हुए विधि के लिए UserInformation उदाहरण के लिए एक ही सूचक पारित करेंगे।

तो आपके मामले में, अगर आपके इरादे सरल करने के लिए है गुण UserInformation की ref कीवर्ड की जरूरत नहीं है, संशोधित करने, आप GetPersonalDetails और GetMachineDetails से वास्तविक उदाहरण को संशोधित किया जाएगा के बाद से। हालांकि, यदि आपका इरादा उन विधियों के अंदर से UserInformation ऑब्जेक्ट को तुरंत चालू करना है या इंस्टेंस को शून्य पर सेट करना है, तो आपको ref कीवर्ड का उपयोग करना होगा।

Jon Skeetthis article में गुजरने वाले पैरामीटर को समझाने का एक अच्छा काम करता है।

4

आपको शायद ref का उपयोग करने की आवश्यकता नहीं है। कक्षाएं संदर्भ प्रकार हैं, इसलिए आप पहले से ही एक संदर्भ पारित कर रहे हैं।

public UserInformation GetUserInformation() 
    { 
     UserInformation userInformation = new UserInformation(); 

     updatePersonalDetails(userInformation); 
     updateMachineDetails(userInformation); 

     return userInformation; 
    } 

    private void updatePersonalDetails(UserInformation userInformation) 
    { 
     userInformation.FirstName = "Sergio"; 
     userInformation.LastName = "Tapia"; 
    } 

    private void updateMachineDetails(UserInformation userInformation) 
    { 
     userInformation.MachineName = "Foobar"; 
    } 
+0

दाएं। क्लास ऑब्जेक्ट के लिए रेफरी का उपयोग करने के लिए केवल एक बार जब आप foo = somethingElse कहना चाहते हैं। – ojrac

+0

क्या आप कृपया विस्तृत कर सकते हैं? क्या आप मुझे रेफरी का उपयोग किए बिना अपना कोड दिखा सकते हैं जैसे कि यह अब काम करेगा जैसा कि मेरे पास है? मैं सीखने के लिए उत्सुक हूँ! –

+0

@ सर्जीओ: आपका कोड कुछ भी नहीं करता है ... आपका मतलब क्या है "काम अब मेरे पास है"? –

0

सी ++ के विपरीत, सी # गुजर में एक समारोह के लिए चर संदर्भित एक ही चर का उपयोग कर दिए गए हैं:

यहाँ ref के बिना अपने कोड और फिक्स्ड अन्य शैली मुद्दों की एक संख्या है। इसका मतलब है, आप चर बदल सकते हैं और यह परिवर्तन कॉलर के लिए दृश्यमान है। रेफरी कीवर्ड संदर्भ को बदलने की अनुमति देता है (इसका मतलब है, संदर्भ संदर्भ द्वारा पारित किया जाता है)। इसका अर्थ यह है कि फ़ंक्शन नल के संदर्भ को सेट कर सकता है या इसे किसी अन्य ऑब्जेक्ट को असाइन कर सकता है, और यह परिवर्तन कॉलर के लिए दृश्यमान है। हां, फ़ंक्शन और कॉलर दोनों द्वारा रेफरी का उपयोग किया जाना चाहिए। यह सी ++ से बेहतर है, आप एक कॉलर कोड में देख सकते हैं, वह पैरामीटर संदर्भ द्वारा पारित किया जाता है।

यदि आप सी/सी ++ जानते हैं, तो रेफरी कीवर्ड के बिना कार्य करने के लिए संदर्भ प्रकार पास करना सी ++ में समान है। रेफरी के साथ काम करने के लिए संदर्भ प्रकार पास करना सी ++ में ** जैसा ही है।

3

मैं धारणा है कि रेफरी कीवर्ड कंप्यूटर एक ही चर का उपयोग करने के लिए और एक नया एक नहीं बना बताता तहत हूं।

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

UserInformation *CompleteInformation = new UserInformation(); 

GetPersonalDetails(&CompleteInformation);  

और अपने कार्य रेफरी है कि इस के लिए अनुवाद:

void GetPersonalDetails(UserInformation **CompleteInformation) 
{ 
    // you can make the CompleteInformation outside to point to new instance 
} 

तो अगर आप नया करने के लिए CompleteInformation बात नहीं होंगे

आप सी में ज्ञान है, तो आपके कोड के ऊपर करने के लिए अनुवाद GetPersonalDetails के अंदर उदाहरण, रेफरी कीवर्ड का उपयोग करने की कोई आवश्यकता नहीं है। कॉलिंग स्टेटमेंट पर रेफरी कीवर्ड हटाएं और फंक्शन कहा जाता है।

var CompleteInformation = new UserInformation(); 
GetMachineDetails(CompleteInformation); 

private void GetPersonalDetails(UserInformation CompleteInformation) 
{ 
    // you cannot make the CompleteInformation outside to point to new instance 
} 

सी # कोड के रूप में सी में अनुवाद किया जाता है यही कारण है कि:

UserInformation *CompleteInformation = new UserInformation(); 

GetPersonalDetails(CompleteInformation);  

void GetPersonalDetails(UserInformation *CompleteInformation) 
{ 
    // you cannot make the CompleteInformation outside to point to new instance 
} 

हम्म .. :-) अभी भी सोच कैसे पूरे सी # मामले में मेरा उत्तर समझाने के लिए, सी सोच को एक सादृश्य नहीं बना।

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