मैंने हाल ही में सी # सीखना शुरू किया और एक बुनियादी कार्यक्रम बनाया जो एक कंपनी का प्रतिनिधित्व करने के लिए एक वर्ग को रोकता है और दूसरे को कर्मचारियों का प्रतिनिधित्व करने के लिए। Company वर्ग में एक Employee किराए पर लेने की एक विधि है (मूल रूप से, Employees की सूची में जोड़ें)।

यहाँ Company के लिए कोड है:

using System;
using System.Collections.Generic;

namespace tutorial {
    static public class Company {
        static public List<Employee> employees = new List<Employee>();

        static public void Hire (Employee emp) {
            employees.Add(emp);
        }

        static public void ListEmployees () {
            foreach (Employee emp in employees) {
                Console.WriteLine(emp);
            }
        }
    }
}

यहाँ मुख्य कार्यक्रम है:

using System;

namespace tutorial {
    class Program {
        static void Main(string[] args) {
            Console.WriteLine("Hello World!");
            Company.Hire(new Employee("John", "Smith", DateTime.Now));
            Company.Hire(new Employee("Jane", "Smith", DateTime.Now));
            Company.ListEmployees();
        }
    }
}

फिर, मेरा प्रश्न यह है: बनाए गए Employee को कब हटाया जा सकता है/कचरा एकत्र किया जा सकता है?

C# वर्ग का प्रभारी व्यक्ति मुझे बताता है कि Hire विधि के वापस आते ही ऐसा हो सकता है। इसका मतलब है कि ListEmployees एक खाली सूची पढ़ सकता है।

हालांकि, ListEmployees उम्मीद के मुताबिक काम करता है। इसके अलावा, मेरी समझ यह है कि संदर्भ गणना का उपयोग किया जाता है, इसलिए Employee को तब तक हटाया नहीं जाएगा जब तक Company स्थिर वर्ग मौजूद है (अर्थात, जब तक प्रोग्राम चल रहा है)।

क्या कोई मुझे बता सकता है कि स्मृति प्रबंधन यहां कैसे काम करता है? क्या मैं संदर्भ गणना की अपनी समझ में गलत हूँ?

0
Aimery 28 सितंबर 2018, 10:26

1 उत्तर

सबसे बढ़िया उत्तर

Microsoft के दस्तावेज़ीकरण से:

जब कचरा संग्रहकर्ता संग्रह करता है, तो यह प्रबंधित ढेर में ऑब्जेक्ट्स की जांच करता है जो अब एप्लिकेशन द्वारा उपयोग नहीं किया जा रहा है और उनकी स्मृति को पुनः प्राप्त करने के लिए आवश्यक संचालन करता है।

आपके प्रश्न का उत्तर देने के लिए Employees एप्लिकेशन बंद होने पर कचरा एकत्र किया जाएगा क्योंकि आपकी कक्षा को static घोषित किया गया है। हालाँकि, यदि आप कक्षा से स्थैतिक को हटाते हैं, लेकिन क्षेत्र से नहीं, तो आपके क्षेत्र में अभी भी आवेदन के समान जीवन काल रहेगा। आपको न केवल कक्षा से बल्कि क्षेत्र से भी स्थैतिक को हटाने की आवश्यकता है।

पर्दे के पीछे माइक्रोसॉफ्ट static कीवर्ड को लागू करने के लिए माइक्रोसॉफ्ट सिंगलटन पैटर्न का उपयोग करता है। . इस प्रकार जब तक एप्लिकेशन चल रहा है, तब तक आपकी कक्षा लाइव रहती है।

यदि आप इससे बचना चाहते हैं तो आप अपनी कक्षा को स्थिर नहीं बना सकते हैं इस मामले में Employees कचरा एकत्र किया जाएगा जब Company वर्ग का एक उदाहरण अब उपयोग नहीं किया जाता है। अर्थात।

class Program
{
    static void Main(string[] args)
    {
        Company comp = new Company();

        //Somecode
    }

}
class Company
{
    public List<Employee> employees = new List<Employee>();

    public void Hire(Employee emp)
    {
        employees.Add(emp);
    }

    public void ListEmployees()
    {
        foreach (Employee emp in employees)
        {
            Console.WriteLine(emp);
        }
    }
}

उपरोक्त उदाहरण में जब Main विधि लागू की जाती है तो यह कंपनी वर्ग का एक उदाहरण बनाएगी और उस उदाहरण का जीवनकाल Main विधि का दायरा है। एक बार जब विधि समाप्त हो जाती है तो comp चर कचरा संग्रहण के लिए योग्य हो जाएगा।

मैं आपको जीसी (कचरा संग्रह) के लिए संपूर्ण दस्तावेज पढ़ने की सलाह देता हूं क्योंकि माइक्रोसॉफ्ट ने वास्तव में अच्छी तरह से समझाया है कि चीजें कैसे काम करती हैं।

0
Givko 28 सितंबर 2018, 12:03