4 августа 2014 г.

Частая ошибка №1: Использование ссылок как значений и наоборот. Перевод.

Оглавление

Программисты C++ и многих других языков привыкли управлять тем как они присваивают значение переменной: будет ли это просто значение или ссылка на уже существующий объект. Однако в C# это решение принимается программистом, который писал объект, а не тем кто создает его экземпляр и присваивает переменной. Это частая "ловушка" новичков в C#.

Если вы не знаете является ли объект, который вы используете, объектом-значением или ссылочным объектом, вы можете столкнуться с некоторыми сюрпризами.
Например:


Как вы можете видеть, оба объекта, Point и Pen, созданы одинаковым путем, но значение point1 остается неизменным когда новое значение координаты X присваивается point2, в то время как значение pen1 поменялось когда новый цвет был присвоен pen2. Мы можем сделать вывод что point1 и point2 каждый содержит свою собственную копию объекта Point, а pen1 и pen2 содержат ссылку на один объект Pen. Но как мы может узнать это не проводя такой эксперимент?
Ответ - посмотреть на определение типов объектов (что вы можете легко сделать в Visual Studio поместив курсор на имя типа объекта и нажав F12):


Как показано выше в C# ключевое слово struct используется для определения типа значения, в то время как ключевое слово class используется для определения ссылочного типа. Для тех, у кого был опыт в C++ и кто успокаивал себя ложным чувством безопасности из-за сходства многих ключевых слов C++ и C#, такое поведение скорее всего вызовет удивление.

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

1 комментарий: