Параметр в методе, кажется, всегда передает копию, вопрос в том, что это копия. Копирование выполняется конструктором копирования для объекта, и, поскольку все переменные являются объектами в C #, я считаю, что это относится ко всем из них. Переменные (объекты) похожи на людей, живущих по некоторым адресам. Мы либо меняем людей, живущих по этим адресам, либо можем создавать дополнительные ссылки на людей, живущих по этим адресам, в телефонной книге (делать мелкие копии). Таким образом, более одного идентификатора могут ссылаться на один и тот же адрес. Ссылочные типы требуют больше места, поэтому в отличие от типов значений, которые напрямую связаны стрелкой с их идентификатором в стеке, они имеют значение для другого адреса в куче (большее пространство для остановки). Это пространство нужно взять из кучи.
Тип значения:
Идентификатор (содержит значение = адрес значения стека) ----> Значение типа значения
Тип ссылки:
Идентификатор (содержит значение = адрес значения стека) ----> (содержит значение = адрес значения кучи) ----> Значение кучи (чаще всего содержит адреса к другим значениям), представьте больше стрелок, торчащих в разных направлениях к массиву [0], Array [1], массив [2]
Единственный способ изменить значение - следовать стрелкам. Если одна стрелка теряется / изменяется таким образом, значение недоступно.