Почему я иногда должен пройти класс по ссылке, а иногда нет? - PullRequest
3 голосов
/ 21 августа 2011

У меня есть метод, который принимает List<Foobar> и Foobar в качестве параметров.Foobar - это обычный класс с закрытыми переменными, конструктором и методами для работы с данными.

Я изменяю оба экземпляра, переданные в методе, но по какой-то причине я должен передать Foobar с refКлючевое слово или иначе изменения не остаются, когда метод завершается.Я не обязан делать это для списка.

Я заметил это пару раз в моем программировании.Обычно при передаче экземпляра класса методу, изменение его изменяет экземпляр, но иногда это не так, и для фиксации изменений требуется ключевое слово ref.Кажется довольно случайным, когда это работает.Кто-нибудь знает, почему это так?

Ответы [ 2 ]

7 голосов
/ 21 августа 2011

Если значение параметра изменяется следующим образом:

parameter = new SomeValue();

, то это изменение будет только , которое будет видно вызывающей стороне с помощью ref.

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

public void AppendHello(StringBuilder builder)
{
    // This changes the data within the StringBuilder object that the
    // builder variable refers to. It does *not* change the value of the
    // builder variable itself.
    builder.Append("Hello");
}

См. Мою статью о передаче параметров для получения дополнительной информации.

Обратите внимание, что если тип параметра является структурой, а не классом, то вы не будете передавать копиюссылки на объект - вы будете передавать сами фактические данные.В этой ситуации вам также необходимо использовать ref.

0 голосов
/ 21 августа 2011

Что вы подразумеваете под «модификацией». Вы можете передать объект методу и изменить его данные, изменив свойства или добавив элементы в общий список. Однако вы не можете изменить фактический объект, на который указывает эта переменная. Чтобы фактически изменить, скажем, Foobar на что-то другое, его нужно передать по ссылке.

...