2011-10-18 22 views
8

संभव डुप्लिकेट:
C# parameters by reference and .net garbage collectionपासिंग सरणी तत्वों

मैं सीमा एक सरणी की जाँच सीमित करने के लिए रेफरी तर्कों का उपयोग के बारे में सोच रहा था। उदाहरण के लिए दो तत्वों की अदला-बदली के कोड है:

class Test { 
    int[] array; 

    private void qSort() { 
    ...blah... 
    int temp = array[a]; 
    array[a] = array[b]; 
    array[b] = temp; 
    } 
} 

जो सरणी करने के लिए 4 पहुँच विकल्प होंगे:

class Test { 
    int[] array; 

    private void qSort() { 
    ...blah... 
    Swap(ref array[a], ref array[b]); 
    } 

    static void Swap(ref int a,ref int b) { 
    int temp = a; 
    a=b; 
    GC.Collect(); // suppose this happens 
    b=temp; 
    } 
} 

जो सैद्धांतिक रूप से सरणी

को केवल 2 पहुँच गया है मुझे भ्रमित करने वाला यह है कि मुझे नहीं पता कि वास्तव में क्या होता है जब मैं रेफरी द्वारा सरणी तत्व पास करता हूं। यदि कचरा कलेक्टर में बदलता है, तो स्वैप फ़ंक्शन में कोड निष्पादित करते समय, सरणी को स्थानांतरित करने में सक्षम हो जाएगा? या सरणी कॉल की अवधि के लिए पिन किया गया है?

ध्यान दें कि उपरोक्त कोड एक साधारण परीक्षण केस है। BrokenGlass के रूप में कहे अनुसार, इस एरिक Lippert यहाँ C# parameters by reference and .net garbage collection

सरणी पिन नहीं किया जाएगा और GCollector स्थानांतरित कर सकते हैं और किसी भी accordinly रेफरी अद्यतन करेगा द्वारा उत्तर दिया है: मैं और अधिक जटिल स्थितियों

में इसका इस्तेमाल करने के

संपादित चाहते हैं यह का एक तत्व है कि ढेर पर रहता है के लिए

+2

समय से पहले अनुकूलित करने की कोशिश न करें, * विशेष रूप से * यदि आपको गहन ज्ञान नहीं है कि मशीनरी कैसे काम करती है। मामले में मामला: आपका दूसरा संस्करण ('ref' के साथ) वास्तव में मुक्केबाजी के कारण पहले की तुलना में * अधिक * धीमा होगा (इसे लूप में देखें और देखें)। – Jon

+4

@ जोन, मैं मानता हूं कि प्रदर्शन कारणों से ऐसा करने में शायद कोई बात नहीं है, लेकिन यह पठनीयता में सुधार करता है ... और बीटीडब्लू, उस मामले में कोई मुक्केबाजी नहीं है –

+0

पैनोस, बिंदु पर जोर देने के लिए एक जीसी। कोलेक्ट() जोड़ा अगर आपको यह पसंद नहीं है तो वापस रोल करें। –

उत्तर

0

ढेर ऐसा दिखाई दे सकता:

  • qSort() (सरणी के लिए एक संदर्भ
  • स्वैप है)

तो यदि जीसी.कोलेक्ट() स्वैप में निष्पादित करता है तो अभी भी qSort() में सरणी का संदर्भ है जिसका अर्थ है कि इसे एकत्र नहीं किया जाएगा।

0

Swap फ़ंक्शन अभी भी सरणी 3 या 4 बार एक्सेस करता है, स्वैप फ़ंक्शन सरल कोड पर कोई प्रदर्शन अनुकूलता प्रदान नहीं करता है। यदि यह पुन: उपयोग किया जाता है तो यह उपयोगी हो सकता है।

static void Swap(ref int a,ref int b) 
{  
    int temp = a; //<-- Here, a is in the array 
    a=b;   //<-- a and b are in the array 
    b=temp;  //<-- b is in the array 
} 

कचरा कलेक्टर स्मृति जारी नहीं करेगा आप एक संदर्भ है, होता है जब आप संदर्भ से गुजरती हैं।

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