Готовься к Этим 4 Вопросам на Собеседовании Junior С# Developer
Вставка
- Опубліковано 20 сер 2024
- Собеседование на C# Junior Developer - это не так просто. Джуниор C Sharp - первая ступень работы программиста в данной сфере. Чтобы точно пройти собеседование и стать джуном си шарп - посмотри это видео и подпишись на мой канал! Меня зовут Роман Сакутин, и я помогу тебе познать мир GameDev, а так же легко пройти публичное и техническое собеседование.
Подготовка к собеседованию (бесплатный курс) - lk.ijunior.ru/...
БОРИС (Бесплатное Обучение Разработке Игр) - ijunior.ru/bori...
Обучение с нуля с гарантией трудоустройства - ijunior.ru/csha...
МОЯ КНИГА - csharpbook.saku...
ГРУППА КАНАЛА - holymonkey
ШКОЛА ПРОГРАММИРОВАНИЯ ЯЮНИОР - holymon...
Я В VK - rsakutin
INSTA - / sakutinhuytin
ЧАТ В ТЕЛЕГЕ - t.me/csharp_fa...
На каких вопросах валились вы?
Что такое c#?
Что вы знаете о Garbage collector'e ?
Когда вызывается статический конструктор?
В чем преимущество StringBuilder перед String ?
Что такое Linq?
Вы на плюсах писали ?
Delegate и Enum после компиляции?
Dippps а в чем проблема? Есть книги как писать 3д движки , возможно вы просто книги не читаете
@@dubovikovpv Поздновато отвечаю, но смотри. Стат конструктор перед обычным вызывается, потом инициализатор, потом обычный конструктор. Стринг билдер изменяет существующую память под строку, в то время как стринг анмютабл тип и его конкатенация в обычных условиях приводит к выделению новой памяти, даже елси только одну букву добавляем.
Роман, мы вам перезвоним!
Ви что терасофт?
@@PoixoN нет, просто чернокожий...
Так и не перезвонили
Мое личное мнение.
Задавать такие вопросы на собеседовании это признак того, что работодатель не понимает для чего ему сотрудник. Дело в том, что компания обычно занимается вполне определенным видом работ и эти работы не абстрактны, как показанные задачи. Поэтому стоит спрашивать именно по часто встречающимся задачам для будущего сотрудника, а не просто какие-то интересные вопросы из справочника.
Да проблема ещё и в том, что вопросики так себе. Особенно 4-й, это тупость. Это работает потому что у строки, например, оператор == перегружен и работает как equals(), где помимо сравнения ссылок сравнивается ещё и контент. Просто тупой вопрос как по мне, можно просто создать класс подобного типа с перегруженных оператором сравнения.
@@vivaleute5141 Я проверил - оно работает с ненулевыми строками.
@@JohnDoe-tm1rv Ну молодец, что проверил, хотя, если ты программист, то как бы знать должен. Так а к чему это было сказано?
@@vivaleute5141 Забудь, оно таки не работает
@@JohnDoe-tm1rv Не работает у тебя в голове разве что
Ну а в реальном мире, джуны в геймдеве никому не нужны. Никто не будет вам предлагать сделать тестовые задания. И если у вас уже много самодельных работ, вам повезёт, если их хотябы посмотрят. Так что будьте к этому готовы. Не пессимист, просто говорю как есть
для Unity - нужны. Junior-ы занимаются версткой интерфейсов и созданием вьюшек под них.
Вывод - пилю игру сам в соло) Главное что бы для игрока всё работало, как я там буду три яруса говна мазать игроку не интересно. Если игра получит аудиторию у меня появятся деньги и время на переписывание кода уже в тиме с более менее толковым кодером. Нахер студии с их 100500 три в ряд и донатными помойками!
По второму вопросу объяснение в корне неправильное. Если бы был боксинг, то структуры через using вообще нельзя бы было освобождать - ведь был бы тот же боксинг. Но никакого боксинга в реальности тут не будет, т.к. в данном случае будет выполнен constrained вызов Dispose(). А вот копирование структуры выполнено действительно будет, но не на выходе из блока using, а на входе в него. Просто using так работает - копирует то, что ему подано на вход извне.
По 4-му - тоже. Дело не в интернировании строк (этот механизм по-умолчанию всегда отключен), что легко проверить, передав конструктору строки непустой массив. А в том, что генерируется ссылка на String.Empty, кот. единственная на домен.
В общем, читайте первоисточники, а не ориентируйтесь на ролики в ютюбе.
Главное не ориентироваться на такие комментарии...
Про using я половину не понял. Но почему это using копирует? Это не так. Если заменить структуру на класс в примере все заработает. using ничего не освобождает - учит мат часть. Кстати с 8го шарпа пример таки заработает, ибо там убрали каст к интерфейсу и теперь using просто вызовет Dispose() даже если IDisposable не указан.
Стринги всегда по умолчанию интернируются, если что. Не уверен про сам пример, но интернирование работает только с литералами. Если включить интернирование, то следующий код будет верен:
string a = "a";
string b = "a";
a != b
Но вообще пример из ролика подозрительный конечно.
@@nooftube2541 Зачем наезжаете на чужие комментарии, если в своём пишете чушь?
1) using копирует на входе, чтобы убедиться в этом, достаточно взглянуть на IL, даже лезть в спецификации не нужно. То что в случае класса работает - так то копируется ссылка. Удивительное, как говорится, рядом.
2) Не надо придираться к словам, пытаясь казаться умнее. Dispose в нормальной жизни как раз освобождает ресурсы - для этого и предназначен.
3) Про C# 8.0 - опять чушь пишите. using работает через duck typing только для ref struct. Это особый случай, в бизнес коде встречающийся крайне редко. Очевидно, вы что-то слышали, но только левым ухом или поняли не до конца.
4) Стринги никогда по умолчанию не интернируются, с чего вы это взяли? Прежде чем писать свой коммент, я это кстати проверил, как и все др. свои утверждения. Что же касается вашего кода, то едва ли вы его проверяли, ведь он даже не компилируется, и разбираться, что вы там имели в виду, я не собираюсь. Интернирование литералов - это вообще тут не подходит, где вы в примере 4 видели литералы?
@@zachemny
1. ошибся - да. Логично что копирует
2. есть множество способов использования Dispose помимо освобождения ресурсов. Но то что сам Dispose ничего не освобождает - особенно сам объект - это самое важно в понимании Dispose. Но если грубо, то конечно можно так сказать... но в любом случае это освобождение ресурсов, а не объекта.
3. Действительно, у меня компилится только для ref struct, что странно, потому что по спеке - должно работать для всего: docs.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-8.0/using#detailed-design
4. литералы всегд аинтернируются по дефолту: docs.microsoft.com/en-us/dotnet/api/system.string.intern?view=netcore-3.1 но можно отключить. "Обычные" (то есть собранные) стринги не интернируются, и это никак нельзя включить "по-дефолту", только явным вызовом String.Intern(). Но в примере действительно не в этом дело. Странные дела со string.Empty, не знал что оно так хитро работает.
А причем мой тут код, и откуда вы знаете компилируется он или нет?
@@nooftube2541
1) Ага, уже вежливее, это хорошо.
2) Если у вас в коде Dispose будет часто заниматься чем-то, кроме освобождения ресурсов, то это будет вызывать закономерные WTF у ваших коллег на код-ревью или при поддержке. Так что лучше ИМХО всё-таки придерживаться общепринятых норм. А так-то конечно: конструктор может заниматься освобождением ресурсов, а Dispose() - их выделением, компилятору всё равно, что вы в них напишите.
3) Там по вашей ссылке какая-то вода:
The language will add the notion of a disposable pattern. Это вообще в будущем времени.
ref struct: These types can't implement interfaces today and hence can't participate in using statements. А это уже не актуально.
Так что ИМО лучше читать пропозалы, там как-то более чётко описывается, что было/будет имплементировано.
4) Когда-то давным-давно можно было включить автоинтернирование для всех строк, но видимо потом эту фишку выпилили. Возможно никому не пригодилась. Впрочем могу и ошибаться, никогда этим не пользовался.
4.1) Со String.Empty ничего хитрого: referencesource.microsoft.com/#mscorlib/system/string.cs,1577 Вот код конструктора строки из массива char, предельно простой.
5) Ваш код:
string a = "a";
string b = "a";
a != b
Что такое a != b ?
Чтобы обсуждать код надо писать законченные фрагменты. К тому-же 2 одинаковые строки конечно будут равны между собой, будь там интернирование, или нет его. Проверять интернирование надо так:
var isInterned = String.IsInterned(a);
а на единый общий инстанс так:
var eq = ReferenceEquals(a, b);
А ваш код ни к селу ни к городу. Вот и создаётся ощущение (правильное), что у человека каша в голове.
using Dispose() тут просто обнуляет ссылку на кучу... так как в using передается копия ссылки
не вопросы для джуна, а интересные задачки для более глубокого изучения языка. таких задач можно придумать миллион и завалить любого
ну я бы не сказал вопросы в принципе простые
@@sergs2919 , как бы я ток начал изучать, я и близко ничего не понял. Я о представленном даже не слышал и близко не представляю где это применимо. Я может быть не прав, но на мой взгляд такие вопросы попытка найти мидла за зарплату джуниора.
@@dkvChannel так это легкие вопросы
@@kadencode5347 , ну я рад за тебя...
@@dkvChannel ну смотри, первое задание например совсем понятное. Перегрузку ты должен был проходить в изучении функций. Класс B наследуется от класса A.
A - его родитель, и в соответствии B наследует все его методы. Но поскольку метод Foo перегружается в классе B вывод очевиден)
Рельно самая большая проблема в устройстве на работу - это то, что каждый работодятел желает, чтобы соискатель был весь такой полностью готовый гений, знающий прям всё, и особенно - всякие специфичные фреймворки и расширения для Юнити, которые применяет лишь этот работодятел.
И причём, у каждого работодятла, эти расширения и фреймворки - свои!
Под каждого бросаться их учить, чтоб попытаться устроиться - тоже не дело.
Вот и жопа получается...
Просто приходишь к начальнику, кладёшь ноги на стол и говоришь:«С этого дня я работаю у вас»
желательно чтоб соискателю было не больше 20ти лет а опыта работы не мнее 10ти.
8:00 нет, object может каститься только к реальному типу, который был до упаковки. т.е. даже если у тебя изначально был short, ты не сможешь скастовать его до int.
На вход дан массив цифр (2-9). Каждой цифре может соответствовать несколько символов (как латинские символы на кнопках старых сотовых телефонов).
По заданной последовательности цифр вывести все возможные комбинации символов получаемые заменой каждой цифры одним из символов соответствующим цифре.
Пример: на входе - 233
2 - abc
3 - def
Вывод:
add
ade
adf
aed
aee
aef
afd
afe
aff
...
cff
C# знаю на уровне синтаксиса, но в целом стаж 10+ лет с другими языками. Как ни странно, но ответил на все правильно, хотя соображения почему отличались от ответа автора
Только начинаю изучать программирование, из видео нифига не понял. Вернусь Джуниором через пол года :D
5 месяцев прошло, как дела?
@@belozerov_mi Бро, шаришь в с#?
Так красивее:
object x = new string(string.Empty);
object y = new string(string.Empty);
Console.WriteLine(x == y);
Ответ на 2 очень простой, трахнуть стулом по голове человека который описывает структуры с диспоуз и пишет юзинг в такой манере.
Структуры в Шарпе нужны для интеропа и взаимодействия с С++ либами например, после вызова метода библиотеки она вернет нам указатель на место где лежит результат в стеке, мы сможем зная размеры типов полей наложить туда структуру и прочесть результат.
Наличие в структурах ссылочных типов и тем более объекта который необходимо утилизировать это говнокод. Вопрос зачем спрашивать про говнокод?
object x= new Random (0,0);
object y = new Random (0,0);
Console.writeLine(x==y);
Очень странные задачи. Никакой практической ценности. Если вам такое задают, то лучше бы спросить себя нужно ли работать в такой компании.
Курст не бесплатный. Нжно 20баллов что бы их получить нужно
Подтвердить почту +5 балов
Пригласить друга +5 балов
получить сертификат + 50 балов. Так что нифига он не бесплатный
Очень напоминает статью из метанита.
Это и есть с метанита
@@instkoff А на метаните с Рихтера
@@yippeeki-yey а Рихтер не для джунов, ту-дунс )
Вроде на джуна такие вещи и спрашивали, полезный для начинающих видос :)
Батенька, интерфейс реализуется структурой, а не наследуется! Также забыл сказать какой именно интерфейсный метод реализуется. Тоже что ли, пойти по-предовать? :)
Продолжай, ну и зацепи Unity естественно :3
Я придумал еще одно решение:
object x = new string(string.Empty);
object y = new string(string.Empty);
Console.WriteLine(x == y);
Похоже, что string.Empty ("" тоже подойдет) приводит к такому же результату, как пустой массив символов.
С dispose пример чудовищный. Использование disposed объектов запрещает сам смысл using. Троллинг с value типами, это вообще отдельный котел для создателей c#
Не запрещает, если знаешь как используется.
DownCast (вниз к производному классу) невозможен без предварительного UpCast(вверх к базовому классу)
Круто. Уже что-то понимаю в языке)
Если ты хорошо знаешь С#, это ты должен вести собеседования. Достоин ли они что бы платит тебе ))
Неплохо
Когда говоришь на видео, хотя бы маленько напрягай свои голосовые связки, твоё хрипение слушать не очень приятно.
В 3, как показалось, не совсем верно объясняется - то, что short не вмещает всех значений int, не является причиной падения, на (long)obj точно так же падало бы; приводить можно , именно как дальше говорится, только к вышестоящим по иерархии, а в случае структур это могут быть только интерфейсы или ValueType
Разве к ValuType можно кастить?
@@nooftube2541 сейчас проверил такой код, всё работает
int i = 4;
object o = i;
ValueType vt = (ValueType)o;
Console.WriteLine(vt);
а почему должно быть нельзя?
@@nooftube2541 Все значимые типы наследуются от ValueType, так что можно, если тип одинаковый (я про распаковку)
Очень крутой контент. Будет что спрашивать у ребят на зачете в конце школьного года ;)
Я бы даже отвечать не стал на эти вопросы. Просто не пошел бы к работодателю, у которого на интервью такие идиотские вопросы.
Это вопрос из серии: что будет если на java написать Integer a = 1; Integer b = 1; log(a == b); Integer a1 = 1000; Integer b1 = 1000; log(a1 == b1); - в первом случае покажет true, а во втором - false. Потому что в java во время боксинга интов - до 127 - возвращаются Singleton интегера. А после 127 - новый объект. Абсолютно бесполезные знания для написания реальных вещей на java. тем более для Junior.
Если бы было подробнее, тогда было бы лучше, а то некоторые определения совершенно не понятны
Если такие тонкости должен знать джун, что тогда должен знать мидл интересно.
хитрость про интерфейс не знал. спасибо
Я ЧУВСТВУЮ что ты немного затролил Александра Шевчука из itvdn :3
Честно говоря, основательно подумал бы, прежде чем соглашаться на работу в контору, задающие такие вопросы джуну.
Делать структуру IDisposible? Серьёзно, так кто-то в мире буедет делать?
И джун должен шарить в тонкостях работы юзинга при обработке структур?
Это даже не смешно.
PS: в четвёртом вопросе стоило бы обратить внимание не на фокусы с угадыванием, а на то, что структуры сравниваются по значению, соответственно подойдёт new int() или new DateTime(), без всяких там nullable
IDisposable произносится вообще не так, и ударение не там. Почему все разработчики так ужасно коверкают English? Потому что не удосуживаются сверяться со словарем и шпарят по когда-то освоенным шаблонам, конечно же неправильным.
А я думал такие вопросы померли еще в 2010-ом.
Почему 'x' и 'y' в этом случае равны:
object x = new string( new char[0] );
object y = new string( new char[0] );
А в этом нет:
object x = new string( new char[1] { '0', } );
object y = new string( new char[1] { '0', } );
?
потому что пустая строка хранится в единственном экземпляре и компилятор при создании пустой строки просто кидает ссылку на уже существующую пустую строку, а вот при создании не пустой строки, компилятор создаст новый объект в куче и даст первой строке ссылку на этот объект и потом создаст второй точно такой же объект в куче и второй строке даст ссылку уже на новый объект, в свою очередь после апкаста стринга в объект сравнение == для объектов будет сравнивать сами ссылки этих объектов, а ссылки то разные, хоть и указывают они на равные по значению объекты в куче.
Будут равны, только если сравнивать так (string)x == (string)y. Тогда вызовется переопределенный оператор сравнения ==, а в нем реализовано сравнение по значению. Еще будут равны, если написать object.Equals(x,y)
Отличный контент!
Это не те вопросы, у джуна нет опыта. его надо спрашивать теорию, а не дрочить мозг какими-то тонкостями.
Джунов такие вопросы спрашивают не для того, чтобы получить правильный ответ. А для того, чтобы он ошибся, начал думать, воспользовался подсказками и смог исправится и объяснить почему он ошибся. В этом всем процессе начинает бюыть видно как человек мыслит и как решщает зхадачи и способен ли к обучению
Всегда удивлялся тому, что самые крутые прогеры не могут себе даже сайт сделать без глюков. Наверно и курсы у них такие же глючные.
Кстати да)))
Сапожник без сапог)
Никто не видел детальное сравнение ООП и прочего в Java и C# ?. Например, в Java нет virtual, почему, чем это хорошо/плохо, какой аналог struct может быть в Java и т.д.
Знаю, что опоздал, но мало ли кто-то прочтет.
В джаве все нестатические методы по умолчанию виртуальные, а аналогов структурам нет.
Ну структуры быстрее работают(они же в стекле вроде), поэтому скорее всего, чисто теоретически будет быстрее с ними.
В 3 вопросе у Вас ошибка объяснения.
(long)obj - тоже выдаст ошибку.
Ну да, логичнее было сказать что value тип при анбоксинге должен быть таким же, как и при боксингом
@@user-ud2rt2kx7f почти. в int? не будет ругаться.
@@25x25RS почему почти? Был int, и должен стать int.
Очень полезно. Спасибо!
Свалился на 3 и 4
1/4. Я просто тупень... У меня всё.
Откуда ты узнал что у меня завтра собеседование по шарпах? Значит готовлюсь я тут, решил чайка попить, отдохнуть, захожу в ютуб - первый видос - твой
Google algorithms
Удачи, кстати!
Прошёл?
@@enqeegeth3604 Да! Вот только час назад сообщили, очень рад. В общей сложности собеседовало 4 человека, изначально 2 ейчара(общие вопросы, английский и тд), потом два програмиста по скайпу, при том с разных городов для оптимальности выводов. Очень широкий спектр вопросов, долго было. Справшивали ООП(принципы), наследование в шарпах(virual, override), патерны(в часности синглтон реализовать), и еще много всего по констркциям + код писать в онлайне. Дальше был JS основы, потом был вопрос по дискретке упростить логическое выражение. И геометрия, в часности векторное произведение, нормалли, скалярное произведение, производные и тд. Сложно было, думал завалил, ибо много что просто забыл. Но в итоге взяли. Так что всем удачи, ребят пробуйте, не опускайте руки если получаете отказ, когда-то точно повезет если работать)
@@danyilkorotych1727 Круто, молодец! Я буквально 4 месяца назад начал изучать шарп). А вот насчёт математических знаний всё сложно... Кажись помню только терему пифагора, а про дискретку толком ничего и не знаю. До собеса ещё далеко, а уже страшно...
@@enqeegeth3604 ну насчет математики - ее не везде спрашивают, все зависит от специфики разработки, что реально часто спрашивают - это задачки типа как поменять местами две части массива не исполюзуя еще один массив и тд, так что немного потренировать такое нужно, в инете их много
Ставьте скорость на 0.5 и смело засыпайте.
На 3 автор сам не понимает почему распаковка в short не возможна. "Мы туда упаковали int, а short не кастится до int. Дело в том, что short меньше по размеру". А если бы мы туда long кастили, то получилось бы? Автор, кастится должно к тому же типу, а не к большему или меньшему. Сам не понимаешь процессов, которые объясняешь
слушай, ну если в java вот так сделать, наверное ошибки нее будет, потому что в шорт диапазон интовая единица входит
кто-то понял кто автор последнего вопроса?
Напишите пожалуйста Имя не могу понять что Роман сказал
А че за прикол с бесплатным курсом, который не бесплатный по итогу?))
ты говоришь что шорт не катится до Инта, так как он меньше. но это же как раз позволяет ему каститься)
Кастится тот что больше, потому что диапазон значений расширяется, а не сужается, и нет потенциальной утечки данных.
По ссылке не бесплатный курс, надо сделать какие-то действия, потратить на это время, время это деньги. Так то.
А что мой комментарий то стерли про IDisposable?
Бесплатный курс с гарантией.
4 из 4. Задачки какие-то ну уж через чур лёгкие. По поводу 4 задачи: чтобы всегда возвращало true нужно убрать "?" перед вызовом конструктора структуры int. Да и вообще подойдёт вызов любого конструктора 2-х одинаковых структур... 2-е решение это какие-то танцы с бубном, потому что можно было просто сделать var x = new char(); и всё (собственно, опять же вызов конструктора структуры).
Но нет же! Нужно блеснуть своим "умом" и написать что-то вроде:
var x = new string(new char[new char().ToString().IndexOf("", StringComparison.Ordinal)]);
var y = new string(new char[new char().ToString().IndexOf("", StringComparison.Ordinal)]);
Если бы мне такое собеседующий задвинул, я бы рукой себе лоб пробил.
как охуенно объяснил просто лацк!
В четвертом ещё можно было создать со стрингом метод инсерт
Ай диспосЕйбл... у меня всё.
Последнее, а бул подойдёт?
Отучился 2 года на программиста, не разу не юзал object и var. Слышал, но не использовал... Пора читать книги...
var - это синтаксический сахар, который используется лишь в зависимости от конвенций компании, в которой работаете.
using System;
using System.Threading;
using static System.Console;
internal sealed class Test
{
public float Example;
}
namespace FirstTest
{
internal sealed class Test
{
public string Example;
}
internal class Program
{
private static void Main()
{
//var t = new Test();
//t.Example = 2.2f;
Task();
ReadKey();
}
private static void Task()
{
var array = new[] {4, 8, 15, 16, 23, 42};
foreach (var i in array)
{
ThreadPool.QueueUserWorkItem(callBack => Write($"{i} "));
}
}
}
}
1) как сделать так, чтобы закомментированный код работал не трогая класс Test
2) Что выведет метод Task()
1) добавить переименовывающий using, например using OuterTest = Test;
2) Не уверен, но вроде не определено, т.к. метод закончится, когда заполнится очередь в цикле, а что потоки успеют выполнить и в каком порядке не определяется. Может ошибка даже, если callback попробует читать массив после снятия ссылки со стека
2) 42 23 16 15 8 4
Ужос какие дебильные вопросы. Никогда такие не задаю. Принимал на работу человек 100.
Правильные вопросы: как бы вы реализовали игру жизнь(предоставляются правила)? Как лучше индексировать номера телефонов? Есть стандартный массив, как бы вы его перевернули задом наперёд без вызова функции reverse? (написать код на бумажке).
Ну тоже такие себе вопросы... главное у программиста это мышление, абстракции, композиция и декомпозиция задачи.. кодинг и правила языка это малая доля хорошего ПО
Написать код на бумажке? А потом ты подтираясь ей, его соберёшь? А чем смысл? Или в голове вообще ничего?
@@maxumka548 В чем проблема 3 строчки написать? Хоть псевдоязыком.
ВСЕГДА БЫЛО ПЛЕВАТЬ НА СОБЕСЕДОВАНИЕ ЭТО Я ИМ НУЖЕН НЕ ОНИ МНЕ
На первый взгляд первый пример - хорошее мнемоническое объяснение. Кот и животное. Но если поменять их местами? И все - ответ сыплется. Типа слева требуют кота, а в правой части выражения стоит животное. Так автор принял. Но джун может это не знать. Почему так принято?
Поставьте скорость проигрывания 1.25 =)) и будет нормально
Мне на 2.0 норм, привык )
Реальное собеседование на middle developer ua-cam.com/video/-y5etXS6efs/v-deo.html
Вы забыли написать, что по ссылке - собеседование на FRONTEND developer
IDespacito
ДИ СПА СЕЙБЛ 🎊🎊🎊
128 лайков)
Какой же талант 2*2=4 так долго об этом рассказывать. Херня, эти вопросы все знают. Говорить про них 30сек.