Сборщик "мусора" очищает объекты, подписанные на события?

Я считаю программирование искусством. Таким образом, я разделяю методы, когда считает правильным разделить их или написать новый.

Тем не менее, есть некоторые правила большого пальца (которые не отменяют мои инстинкты).

  1. Если вам нужно прокрутить экран, чтобы прочитать один метод, вам нужно разделить его
  2. ЕСЛИ у вас есть deja vue (код, который вы пишете, кажется знакомым), вы, вероятно, повторяетесь Это означает, что вы должны использовать существующую функцию / метод, а не писать новую.

  3. Не более двух глубоких конструкций

    для (...) для (...) для (...) ПЛОХОЙ

  4. Нет более одной петли подряд (одна за другой).

  5. Если вам нужно вернуть более одного типа данных (нулевой / ложной версии нет), вам нужно что-то разделить.
  6. Если вы запутались при чтении вашего метода - разбейте его
  7. Метод / функция должны отвечать за одну задачу.
  8. Самое очевидное - при написании новой функциональности: -)
5
задан Keltex 29 May 2009 в 21:50
поделиться

3 ответа

Это будет собираться GC. Чтобы объект сохранялся в памяти, он должен прямо или косвенно ссылаться на ...

  1. Значение в стеке
  2. Значение, основанное на сильном дескрипторе GC
  3. Угловой случай или два, о которых я не думаю на данный момент

Это неверно для объекта в лицах [0]. Итак, он будет собран.

Это, конечно, при условии, что конструктор для Person () не делает ничего забавного, например, добавляет себя в ThreadLocalStorage.

8
ответ дан 18 December 2019 в 12:01
поделиться

Вы на полпути; это было бы утечкой памяти, если бы было наоборот. То есть, если бы это выглядело так:

public class Test
{
    public void HookupStuff()
    {
        List<Person> persons = new List<Person> { new Person() };

        this.EventHappened += new EventHandler(persons[0].SomeMethod);
        // persons[0].Sneezing += new EventHandler(Person_Sneezing);

        persons = null;
    }
}

Теперь лиц [0] будут оставаться, даже если вы обнулили человек , поскольку родительский класс имеет ссылку на метод на нем.

6
ответ дан 18 December 2019 в 12:01
поделиться

В дополнение к уже полученным ответам, вам нужно быть осторожным с более реалистичными примерами.

Если в вашем приложении есть главное окно, которое сохраняется, пока выполняется программа, и вы часто создаете «недолговечные» объекты, которые присоединяют свои методы к событиям в главном окне, тогда вы должны исключить объекты из этих событий, когда они вам больше не нужны, потому что в противном случае эти объекты не будут «недолговечными» в все - они будут жить до тех пор, пока не откроется главное окно, т.е. пока пользователь не закроет приложение. Эффективный результат будет эквивалентен утечке памяти.

Это может помочь, если вы сделаете класс недолговечного объекта реализацией IDisposable , чтобы вы могли исключить события из списка в Dispose ,

1
ответ дан 18 December 2019 в 12:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: