C #: лучше хранить ссылку или передать ее в качестве параметра? - PullRequest
1 голос
/ 09 сентября 2011

У меня есть родительский объект, который поддерживает список дочерних объектов.Периодически он просматривает список дочерних объектов и вызывает метод DoWork для каждого из них.Иногда дочерние объекты должны ссылаться на родительский объект в методе DoWork.Лучше ли хранить ссылку, указывающую на родителя, используя число в 4 байта (верно?), Умноженное на число дочерних элементов памяти, или передавать ссылку на родителя в качестве параметра каждый раз, когда метод DoWork ()называется?Каковы издержки, если любой из передачи дополнительного параметра?Отличается ли MS .NET от Mono в этом отношении?

Ответы [ 3 ]

1 голос
/ 09 сентября 2011

Либо это примерно одинаковые накладные расходы, то есть минимальные.

Однако, если потомки можно отсоединить от родителя или присоединить к другому родителю, тогда у вас есть накладные расходы на управление сохраненной ссылкой в ​​потомке.

Лично я считаю, что передавать «это» от родителя каждый раз - лучший способ.

1 голос
/ 09 сентября 2011

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

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

0 голосов
/ 09 сентября 2011

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

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