В какой момент вы должны понимать ссылки? - PullRequest
15 голосов
/ 07 мая 2010

Я задал такой вопрос в интервью для программиста начального уровня:

var instance1 = new MyObject{Value = "hello"}
var instance2 = instance1;

instance1.Value = "bye";

Console.WriteLine(instance1.Value);
Console.WriteLine(instance2.Value);

Заявитель ответил «привет», «пока» в качестве вывода.

Некоторые из моих коллег сказали, что «указатели» уже не так важны или что этот вопрос не является реальным судьей способностей.

Они правы?

РЕДАКТИРОВАТЬ: Было отмечено, что MyObject мог быть структура. Это хороший момент. Однако я не опубликовал полный вопрос, который дал респонденту. В полном вопросе был класс, который был явно классом (а не структурой). здесь .

Ответы [ 13 ]

18 голосов
/ 07 мая 2010

Они абсолютно не правы. Кроме того, это вопрос ссылок, а не указателей. Если вы не получаете его, вы не заслуживаете оплачиваемой работы написания C #.

16 голосов
/ 07 мая 2010

Некоторые из моих коллег сказали, что «указатели» уже не так важны

Понимание разницы между ссылочной семантикой и семантикой значения имеет решающее значение. Это имеет основополагающее значение для дизайна языка и системы типов. Понимание того, что ссылки могут быть реализованы с помощью указателей, не особенно важно для программистов C # начального уровня; понимание различий между копированием по ссылке и копированием по значению очень важно.

или что этот вопрос не является реальным судьей способностей.

Ну, это зависит от того, какую способность вы пытались проверить. Если способность быстро и точно прогнозировать поведение тривиальных программ на C # имеет отношение к вашей работе, то я бы сказал, что это хороший тест на способности.

Если способности определить, когда недостаточно информации для решения проблемы, и задать правильные вопросы, чтобы выявить эту информацию, актуальны, тогда да, это судья соответствующих способностей. (Хороший кандидат попросил бы увидеть реализации типа myObject и члена Value, а не предполагать, что myObject - это класс, а Value - изменяемое свойство типа string.)

Я говорю, что все эти способности актуальны, и что это разумный первый вопрос для позиции начального уровня.

10 голосов
/ 07 мая 2010

Это действительно фундаментальный материал. Вопрос даже не в указателях, а в ссылочной семантике в C #, которая является одним из наиболее важных аспектов языка. Любой, кто называет себя программистом C #, должен это понимать.

5 голосов
/ 07 мая 2010

Вы должны понимать ссылки на указатели и задолго до того, как закончите колледж.

Я написал выше, прежде чем заметил, что этот вопрос был помечен C #.

Вам не нужно ничего знать об указателях для программирования на C #. Тем не менее, я придерживаюсь своего первоначального утверждения в общем смысле профессионального программиста.

Кроме того, как уже говорили другие, этот вопрос действительно касается ссылок. Вы ДЕЙСТВИТЕЛЬНО должны понимать ссылки, чтобы быть программистом на C #.

4 голосов
/ 07 мая 2010

Вы должны понимать ссылки, прежде чем начать давать интервью на C #.

3 голосов
/ 07 мая 2010

Зная, как работает ссылка на объект в C #, я считаю это важным. (Конечно, можно прожить долгий путь, ничего не зная ... но вы редко платите за код OO)

Указатели с другой стороны, не так уж и много.

2 голосов
/ 07 мая 2010

Даже если вы не используете указатели и небезопасный код, вы определенно должны понимать концепцию и знать, как ее использовать. Если вы собираетесь работать в C #, я могу простить, не зная арифметику указателей, потому что вы, скорее всего, не будете ее использовать и, скорее всего, не должны ее использовать. Но указатели существуют вокруг нас даже в управляемом мире C #.

string s = "abc"  
int a = 3;

Одна из этих двух переменных на самом деле является указателем (Ссылка. Что угодно. Та же самая вещь). Который из? Честно говоря, человек, который не знает, что ему нужно на год получить работу, используя C, после этого наверняка поймет.

Представьте, что этому парню нужно написать функцию, которая принимает строку ref. Это:

  1. Неизменное.
  2. Ссылка на неизменный объект.
  3. Ссылка на ссылку на неизменный объект. (Неизменяемость не имеет ничего общего с указателями. Просто будет еще более запутанно, если она неизменна ^^)

Человек сойдет с ума, пытаясь понять это, если он не потерял девственность указателя в Си заранее. Или, что еще хуже, представьте, что какая-то критическая часть вашего кода использует словарь, содержащий некоторую ценную информацию в классе, и этот парень меняет одно из его значений, которое изменяет GetHashValue объекта и заставляет вас «потерять» экземпляр.

Даже если здравомыслящие разработчики C # не используют явные указатели в своем коде, это не означает, что указатели не используются неявно.

Каждый хороший программист должен точно понимать, что абстрагирует их язык, иначе он никогда не сможет правильно понять язык. Чтобы правильно делать C #, вам нужно знать C, а чтобы правильно делать C, вам нужно знать ассемблер.

Кроме того, ваш вопрос - насколько вы знаете, ваш собеседник предположил, что myObject является структурой. Скорее всего, нет, но все же.
Изменить: Да, ссылки не являются фиксированными, в отличие от указателей. Но концептуально нет никакой разницы.

2 голосов
/ 07 мая 2010

Если кандидат не может ответить на этот вопрос, это свидетельствует о большой нехватке его фундаментальных знаний C #. Покажи им дверь и скажи пока!

2 голосов
/ 07 мая 2010

Я думаю, что это справедливый вопрос.

Убедитесь, что вы не просто оценили этот вопрос на простой основе PASS / FAIL.Задавайте вопросы типа «Почему?»и "Что именно делает строка 'instance1.Value =" bye ";" или строка "var instance2 = instance1;"на самом деле? "Начните диалог о том, что происходит под капотом.Вы узнаете много нового о кандидате по тому, насколько глубоко он может нести обращение, а также по тому, смогут ли они следовать вашим объяснениям.

1 голос
/ 07 мая 2010

Это не хороший знак для тех, кто имеет опыт работы с C #.

Если кандидат не просто изучает язык и выглядел очень блестяще, для меня это было бы близко к соглашению.

Как минимум, зияющая дыра в знаниях, как это, скажет мне, что потребуется много тренировок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...