В Javascript передача объекта другому классу вызывает утечку памяти?

Всякий раз, когда я это делаю, я обычно делаю grid.DataSource результатом проекции LINQ на объекты.

Так что-то вроде этого:

grid.DataSource = objects.Select(o => new
    { Column1 = o.SomeValue, Column2 = o.SomeOtherValue }).ToList();

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

Edit:

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

В этом случае вам может быть лучше определить явную модель представления и проецировать ваши объекты в них. Например,

class MyViewModel
{
    public int Column1 { get;set; }
    public int Column2 { get;set; }
}

grid.DataSource = objects.Select(o => new MyViewModel()
    { Column1 = o.SomeValue, Column2 = o.SomeOtherValue }).ToList();

Редактировать 2:

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

Если вы хотите сохранить ссылку на базовый объект, лучший способ - предоставить его через конструктор:

class MyViewModel
{
    public int Column1 { get;set; }
    public int Column2 { get;set; }

    ....

    private SomeType _obj;

    public MyViewModel(SomeType obj)
    {
        _obj = obj;
    }

    public SomeType GetModel()
    {
        return _obj;
    }
}

grid.DataSource = objects.Select(o => new MyViewModel(o)
    { Column1 = o.SomeValue, Column2 = o.SomeOtherValue }).ToList();

. Причина, по которой я пошел для метода getter для извлечения базового объекта модели, - это просто избежать создания столбца для это.

-2
задан mco 17 January 2019 в 06:36
поделиться

1 ответ

tldr
Объект А будет собирать мусор.

Почему?
Ну, каждый объект в Javascript живет только до тех пор, пока есть ссылка на этот объект. Поскольку в какой-то момент нет ссылки на объект A, он будет удален. Но общий объект, давайте назовем его объектом C, никогда не "принадлежал" объекту A, объект A имел только ссылку на объект C. Поскольку B все еще имеет ссылку на C, C не будет удален.

А как насчет не ссылочных типов?
Хотя ссылочные типы никогда не принадлежат, а существуют как ссылки, примитивные типы принадлежат их родителям.

a = { x: "lorem ipsum" };
b = { y: a.x };

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

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

0
ответ дан Nikita Malyschkin 17 January 2019 в 06:36
поделиться
Другие вопросы по тегам:

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