ढेर
stack
भंडारण के लिए स्मृति का एक ब्लॉक है local variables
और parameters
। स्टैक तार्किक रूप से बढ़ता है और एक फ़ंक्शन में प्रवेश और बाहर निकलने के लिए सिकुड़ता है।
निम्नलिखित विधि पर विचार करें:
public static int Factorial (int x)
{
if (x == 0)
{
return 1;
}
return x * Factorial (x - 1);
}
यह विधि पुनरावर्ती है, जिसका अर्थ है कि यह खुद को कहता है। हर बार जब विधि दर्ज की जाती है, तो स्टैक पर एक नया इंट आवंटित किया जाता है , और हर बार विधि से बाहर निकलने के बाद, इंट को हटा दिया जाता है ।
ढेर
- ढेर स्मृति का एक खंड है जिसमें
objects
(यानी, reference-type instances
) निवास करता है। जब भी कोई नई वस्तु बनाई जाती है, तो उसे ढेर पर आवंटित किया जाता है, और उस वस्तु का एक संदर्भ वापस कर दिया जाता है। एक कार्यक्रम के निष्पादन के दौरान, नई वस्तुओं का निर्माण होते ही ढेर भरना शुरू हो जाता है। रनटाइम में एक कचरा संग्राहक होता है जो समय-समय पर ढेर से वस्तुओं को हटाता है, इसलिए आपका प्रोग्राम नहीं चलता है Out Of Memory
। एक वस्तु सौदा करने के लिए योग्य है जैसे ही यह किसी भी चीज से संदर्भित नहीं है जो स्वयं है alive
।
- ढेर भी संग्रहीत करता है
static fields
। ढेर पर आवंटित वस्तुओं के विपरीत (जो कचरा एकत्र कर सकते हैं) these live until the application domain is torn down
,।
निम्नलिखित विधि पर विचार करें:
using System;
using System.Text;
class Test
{
public static void Main()
{
StringBuilder ref1 = new StringBuilder ("object1");
Console.WriteLine (ref1);
StringBuilder ref2 = new StringBuilder ("object2");
StringBuilder ref3 = ref2;
Console.WriteLine (ref3);
}
}
उपरोक्त उदाहरण में, हम चर Ref1 द्वारा संदर्भित StringBuilder वस्तु बनाकर शुरू करते हैं, और फिर इसकी सामग्री लिखते हैं। वह स्ट्रिंगबुलस्ट वस्तु तब कचरा संग्रहण के लिए तुरंत योग्य है, क्योंकि बाद में कुछ भी इसका उपयोग नहीं करता है। फिर, हम वैरिएबल Ref2 द्वारा संदर्भित एक और StringBuilder बनाते हैं, और उस संदर्भ को Ref3 में कॉपी करते हैं। हालांकि उस बिंदु के बाद Ref2 का उपयोग नहीं किया जाता है, फिर भी Ref3 उसी StringBuilder वस्तु को जीवित रखता है - यह सुनिश्चित करते हुए कि यह संग्रह के लिए योग्य नहीं है जब तक कि हम ref3 का उपयोग करके समाप्त नहीं हो जाते।
जहाँ भी वैरिएबल घोषित किया गया था, वहाँ वैल्यू-टाइप इंस्टेंस (और ऑब्जेक्ट संदर्भ) रहते हैं। यदि उदाहरण को एक वर्ग प्रकार के भीतर या एक सरणी तत्व के रूप में क्षेत्र के रूप में घोषित किया गया था, तो वह उदाहरण ढेर पर रहता है।