Методы, которые возвращают ссылочные типы, возвращают ссылки или клонированную копию?
Я изучаю Java в эти дни, и то, что я прочитал только "Be careful not to write accessor methods that return references to mutable objects"
что действительно интересно. И теперь мне интересно, то же самое для свойств и методов доступа в C#? Или C# уже возвращает клонированные копии автоматически?
Благодарю.
1 ответ
Ссылка - это просто... ссылка на некоторый объект, который хранится в памяти. Если вы явно не напишите код для создания клона и возврата ссылки на этот объект, то вы всегда будете передавать ссылку на один и тот же экземпляр.
Ситуация, которую он пытается избежать, заключается в передаче ссылки на объект вызывающей стороне, от которой вы зависите. Вы не можете контролировать, кто или что может изменить состояние этого объекта, и, следовательно, ваш класс может привести к непредсказуемым результатам.
Глупый пример:
public class Employee
{
public Salary Salary {get; set;}
public void GiveRaise()
{
Salary.Total *= .25;
if(Salary.Total > 100000)
{
Promote();
GiveBiggerOffice();
}
else
{
GiveWatch();
}
}
}
Допустим, у этого парня была зарплата в 50000 долларов, и он только что получил повышение. Теперь его зарплата составляет 62 500 долларов, и он должен получить хорошие новые часы. Тем не менее, вполне возможно, что другой поток имеет ссылку на этот Employee
объект. Это означает, что они также имеют доступ к Salary
собственности, и может изменить общую сумму заработной платы выше $100 000 до запуска блока if.
В этом неловком сценарии сотрудник получит повышение по службе и новый офис, хотя Raise()
метод был вызван только один раз.
Глупо знаю, но демонстрирует суть.