В какой момент вы должны понимать ссылки?
Я задал такой вопрос в интервью для программиста начального уровня:
var instance1 = new MyObject{Value = "hello"}
var instance2 = instance1;
instance1.Value = "bye";
Console.WriteLine(instance1.Value);
Console.WriteLine(instance2.Value);
Заявитель ответил "привет", "пока" в качестве вывода.
Некоторые из моих сотрудников сказали, что "указатели" не так важны или что этот вопрос не является реальным судьей способностей.
Правильны ли они?
EDIT: было указано, что MyObject мог быть структурой. Это хороший момент. Однако я не опубликовал полный вопрос, который я дал интервьюиру. Полный вопрос имел класс, который был явно классом (а не структурой). Здесь можно найти .
Ответы
Ответ 1
Некоторые из моих сотрудников сказали, что "указатели" не так важны
Важное значение имеет понимание различий между ссылочной семантикой и семантикой значений. Это имеет фундаментальное значение для дизайна языка и системы типов. Понимание того, что ссылки могут быть реализованы с помощью указателей, не особенно актуально для программистов С# начального уровня; понимание разницы между копированием по ссылке и копированием по значению очень важно.
или что этот вопрос не является реальным судьей способности.
Хорошо, это зависит от того, какую способность вы пытались протестировать. Если способность быстро и точно прогнозировать поведение тривиальных программ на С# имеет отношение к вашей задаче, я бы сказал, что это хороший тест способности.
Если способности определять, когда недостаточно информации, предоставленной для решения проблемы, и задавать правильные вопросы для получения этой информации, имеют значение, то да, это судья соответствующих способностей. (Хороший кандидат попросил бы увидеть реализации типа myObject и member Value, а не предполагать, что myObject является классом, а Value является изменяемым свойством строки типа.)
Я говорю, что все эти способности актуальны, и что это разумный первый вопрос для позиции начального уровня.
Ответ 2
Они абсолютно ошибаются. Кроме того, речь идет о ссылках, а не указателях. Если вы этого не понимаете, вы не заслуживаете оплачиваемой работы, написав С#.
Ответ 3
Это действительно фундаментальный материал. Вопрос даже не в указателях, а о ссылочной семантике в С#, что является одним из важнейших аспектов языка. Любой, кто называет себя программистом на С#, должен это понимать.
Ответ 4
Вы должны понимать ссылки указателей и задолго до выхода из колледжа.
Я написал выше, прежде чем заметить, что этот вопрос был помечен С#.
Вам не нужно ничего знать о указателях для программирования на С#. Тем не менее, я придерживаюсь своего первоначального заявления в общем смысле о том, что я профессиональный программист.
Кроме того, как говорили другие, этот вопрос действительно касается ссылок. Вы ДЕЙСТВИТЕЛЬНО должны понимать ссылки, чтобы быть программистом на С#.
Ответ 5
Вы должны понимать ссылки, прежде чем начинать давать интервью С#.
Ответ 6
Зная, как работает ссылка на объекты в С#, я считаю важным.
(Конечно, вы можете долго продержаться, ничего не зная... но это редко код OO, за который вы хотели бы заплатить)
Указатели, с другой стороны, не так много.
Ответ 7
Я думаю, что это справедливый вопрос.
Убедитесь, что вы не просто оцениваете этот вопрос на простой основе PASS/FAIL. Последуйте за такими вопросами, как "Почему?" и "Что именно делает строка" instance1.Value = "bye";
'или строка' var instance2 = instance1; ' на самом деле? "Начните диалог о том, что происходит под капотом. Вы узнаете много о кандидате, насколько глубоко они могут переносить преобразование, а также могут ли они следовать вашим объяснениям.
Ответ 8
Если кандидат не может ответить на этот вопрос, он показывает большой недостаток в их фундаментальном знании С#. Покажите им дверь и попрощайтесь до свидания!
Ответ 9
Даже если вы не используете указатели и небезопасный код, вы определенно должны понимать концепцию и знать, как ее использовать.
Если вы собираетесь работать на С#, я могу простить, не зная арифметики указателей, потому что вы, скорее всего, не будете использовать ее и, скорее всего, не должны ее использовать.
Но указатели существуют вокруг нас даже в управляемом мире С#.
string s = "abc"
int a = 3;
Одна из этих двух переменных, на самом деле является указателем (ссылка, что бы то ни было). Который из? Честно говоря, человек, который не знает, что должен уйти с работы на C в течение года, после этого он это точно поймет.
Представьте, что этот парень должен написать функцию, которая берет строку ref. Это:
- Неизменный.
- Ссылка на неизменяемый объект.
- Ссылка на ссылку на неизменяемый объект. (Неизменность не имеет ничего общего с указателями. Это будет просто еще более запутанным, если она будет неизменной ^^)
Человек сойдет с ума, пытаясь понять это, если он не потерял свою указательную девственность в С заранее. Или, что еще хуже, представьте, что какая-то критическая часть вашего кода использует словарь, содержащий ценную информацию в классе, и этот парень меняет одно из значений, которое изменяет GetHashValue объекта и заставляет вас "потерять" экземпляр.
Даже если здравомыслящие разработчики С# не используют явные указатели в своем коде, это не означает, что указатели не используются неявно.
Каждый хороший программист должен точно понимать, что их язык абстрагируется, иначе он никогда не сможет правильно понять язык. Чтобы правильно выполнять С#, вам нужно знать C и правильно выполнять C, вам нужно знать ассемблер.
Кроме того, ваш вопрос. Насколько вам известно, ваш собеседник предположил, что myObject является структурой. Скорее всего, он этого не сделал, но все же.
Изменить: Да, ссылки не фиксированы, в отличие от указателей. Но концептуально нет никакой разницы.
Ответ 10
Передача этого вопроса не говорит о чьей-то способности, но в противном случае он очень сильно говорит о недостатке способности человека. Понимание семантики ссылок и значений фундаментальное означает знание того, как программировать.
Если у человека есть неправильная ментальная модель о том, как будет вести себя программа, в лучшем случае он сможет "программировать случайно" ". Когда все пойдет не так, он не сможет узнать, почему все пошло не так.
Ответ 11
Честно говоря, я закончил полный иск Microsoft Courses около 2 месяцев назад. По общему признанию, я программировал еще дольше, но я бы сказал, что в С# я собираюсь около 2 лет.
Я знаю на самом деле, что эти вопросы возникали несколько раз во время моего исследования, и это было абсолютно, на 100% критично, что все в классе знали об этом. Infact Я бы подумал, что на Microsoft Exam даже есть несколько из них, смешанных с ним.
С точки зрения ученика (хотя, с точки зрения учеников высокого уровня), каждый должен это знать. И если они этого не делают, они не знают достаточно основного программирования (или логики), чтобы сделать это далеко в программировании.
В качестве побочного примечания, моя текущая работа имела небольшой тест во втором интервью. Они заставили меня написать приложение, чтобы проверить Prime Numbers, Factorials, написать свой собственный LastIndexOf и еще один, который я не могу вспомнить с головы.
Я думаю, что логика важнее всего в программировании. И больше, чем знание языка С#, это скорее логический вопрос.
Ответ 12
Это не хороший знак для любого, кто имеет опыт работы на С#.
Если кандидат просто изучал язык и казался очень блестящим, он был бы близок к разрыву сделки для меня.
Как минимум, зияющая дыра в таких знаниях скажет мне, что потребуется много коучинга.
Ответ 13
У нас есть список технических вопросов, которые задают все кандидаты-разработчики в процессе собеседования. Из этих вопросов нужно правильно ответить на определенное число, чтобы рассмотреть кандидата, понимая, что ссылки на С# будут одним из вопросов.