Как еще может ненужное использование ссылки быть разрушительным?
Другие ответы касаются семантических проблем, что, безусловно, является наиболее важной вещью. Хороший код самодокументируется, и когда я даю параметр ref, я предполагаю, что изменится . Если этого не произойдет, API не сможет самодокументироваться.
Но ради интереса, как насчёт другого аспекта - производительности?
void ChangeAddress(ref Customer person, Address address)
{
person.Address = address;
}
Здесь person
является ссылкой на ссылку, поэтому при каждом доступе к ней будет вводиться некоторая косвенность. Давайте посмотрим на некоторую сборку, это может привести к:
mov eax, [person] ; load the reference to person.
mov [eax+Address], address ; assign address to person.Address.
Теперь версия без ссылки:
void ChangeAddress(Customer person, Address address)
{
person.Address = address;
}
Здесь нет косвенного обращения, поэтому мы можем избавиться от одного чтения:
mov [person+Address], address ; assign address to person.Address.
На практике можно надеяться, что .NET кеширует [person]
в версии ref
, амортизируя стоимость косвенного обращения при множественном доступе. Вероятно, на самом деле это не будет 50% -ным падением количества команд за пределами тривиальных методов, подобных приведенным здесь.