Методы, которые возвращают ссылочные типы, возвращают ссылки или клонированную копию?

Я изучаю 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() метод был вызван только один раз.

Глупо знаю, но демонстрирует суть.

Другие вопросы по тегам