передать параметр ref по значению и установить его в null - PullRequest
1 голос
/ 24 мая 2011

Рассмотрим следующий фрагмент кода

Form form2 = new Form();

  test(form2);
  form2.Show();

public void test(Form f)
{
  f = null;
}

Так как f также содержит «другую» ссылку на Form2, установка для нуля значения f должна также установить для Form2 значение null, чего нет. Нужно хорошее объяснение, чтобы понять это.

Ответы [ 2 ]

1 голос
/ 24 мая 2011

Ссылка, установленная на null, является локальной копией ссылки form2. Поскольку ссылка передается по значению, что означает создание точной копии и передачу копии, оригинал остается нетронутым.

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

В методе теста вы устанавливаете переменную, содержащую копию этого адреса, в null. Это не имеет никаких дальнейших последствий.

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

Чтобы сделать еще один шаг назад:

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

0 голосов
/ 24 мая 2011

(я предполагаю, что это Java.)

Параметры метода всегда передаются по значению. Это означает, что их содержимое всегда копируется в новую переменную. В этом случае содержимое переменной f, которая содержит ссылку на объект, копируется в новую переменную. Когда содержимое этой новой переменной заменяется на null, содержимое исходной переменной не затрагивается - оно по-прежнему указывает на исходный объект.

...