Срок службы переменной и сборки мусора - PullRequest
0 голосов
/ 28 сентября 2018

Я недавно начал изучать C # и создал базовую программу, которая противоречит классу, представляющему компанию, и еще одной, представляющей сотрудников.Company класс содержит метод для найма Employee (в основном, добавить в список Employee с).

Вот код для 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();
        }
    }
}

Тогда у меня такой вопрос: когда можно создать / 1013 * созданные объекты, чтобы удалить / собрать мусор?

Ответственный за C #класс говорит мне, что это может произойти, как только вернется метод Hire.Это означает, что ListEmployees может читать пустой список.

Однако, ListEmployees работает как ожидалось.Более того, я понимаю, что используется подсчет ссылок, поэтому Employee не будут удалены, пока существует статический класс Company (то есть, пока работает программа).

Может ли кто-нибудь сказать мне, как здесь работает управление памятью?Я ошибаюсь в своем понимании подсчета ссылок?

1 Ответ

0 голосов
/ 28 сентября 2018

Из документации Microsoft :

Когда сборщик мусора выполняет сборку, он проверяет объекты в управляемой куче, которые больше не используются приложением, и выполняетнеобходимые операции для восстановления их памяти.

Чтобы ответить на ваш вопрос, Employees будет собирать мусор при остановке приложения, поскольку ваш класс объявлен как static.Однако, если вы удалите статические данные из класса, но не из поля, у вашего поля будет тот же срок службы, что и у приложения.Вам нужно не только удалить статическое из класса, но и из самого поля.

За кулисами Microsoft для реализации ключевого слова static Microsoft использует шаблон Singleton .Таким образом, заставляя ваш класс жить до тех пор, пока приложение работает.

Если вы хотите избежать этого, вы можете сделать свой класс нестатичным, в этом случае 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, он создает экземпляр класса Company, а время жизни этого экземпляра является областью действия метода Main.После выхода из метода переменная comp будет иметь право на сборку мусора.

Я рекомендую вам прочитать всю документацию по GC (сборка мусора), потому что Microsoft действительно хорошо объяснила, как все это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...