Распределяет ли ссылочный тип C # новую память при передаче в методы? - PullRequest
4 голосов
/ 05 ноября 2010

все ... Я новичок в C # и таких языках ...

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

Распределяют ли ссылочные типы новую память при передаче в методы?

Например, если я передаю форму методу, например

void myMethod(System.Windows.Forms.Form myForm)
{
...
}

Будет ли выделено больше памяти для хранения всех myForm данных, или он будет содержать только ссылку на то, где myForm данные уже выделены?

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

Ответы [ 5 ]

12 голосов
/ 05 ноября 2010

Когда вы создаете исходную форму, объект формы будет размещен в куче.Когда вы вызываете myMethod, вы передаете ссылочный тип (по сути, указатель на этот объект) по значению.Это означает, что ссылка, которую вы передаете, будет скопирована в контексте myMethod - это включает 32/64 битное выделение стека в зависимости от вашей архитектуры.

Итак, чтобы ответить на ваш вопрос, ваша формане будет скопирован, но ссылка на него будет.

Отказ от ответственности: я не использовал C # целую вечность.

2 голосов
/ 05 ноября 2010

Нет.Передача Form ссылки на функцию не дороже, чем передача целого числа.

A Form - это большой объект (вероятно, десятки килобайт при сложении всего).В качестве параметра может быть передана только ссылка на него.Эта ссылка занимает всего 4 байта (в 32-разрядном процессе) и исчезает при возврате метода.

2 голосов
/ 05 ноября 2010

Технически они создадут копию ссылки (таким образом, другое выделение памяти «размер ссылки»), но фактический объект, на который ссылаются, не будет скопирован и перераспределен.

1 голос
/ 05 ноября 2010

Форма - это класс.В C # класс является ссылочным типом - это означает, что когда он передается, ему передается по ссылке .В основном это означает, что адрес памяти, в которой находится экземпляр Form, передается в кадр стека вместо копирования всех байтов.

Если параметром метода был struct или тип примитива, например int, тобудет тип значения.При передаче значений в типы значений все данные копируются в кадр стека метода.

1 голос
/ 05 ноября 2010

Нет, выделена только ссылка.

В C # экземпляр ссылочного типа может передаваться только по ссылке. То есть сам объект никогда не копируется, только ссылка на него.
Строго говоря, когда вы передаете объект методу, его ссылка передается значением . Это означает, что вы можете получить доступ к объекту, используя эту ссылку, и изменения, внесенные в объект, будут видны в коде, вызвавшем ваш метод, но, если вы сделаете эту полученную ссылку на какой-либо другой объект, это изменение не повлияет код, который дал вам исходную ссылку - потому что ссылка была передана по значению.

В отличие от типов значений, которые при передаче по значению копируются.

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