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



Все... Я новичок в C# и подобных языках...



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



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



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



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


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



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

5 ответов:

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

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

Отказ От Ответственности: I давно не пользовался C#.

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.