8 заданий по C#, которые могут попасться на собеседовании


Оглавление (нажмите, чтобы открыть):

Задачи по программированию. Где размять руки?

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

В обучении программированию действует тот же принцип. Конечно, на GeekBrains вы получите практические задания и помощь преподавателей. Однако и после завершения курсов вы наверняка захотите размять руки, а также повысить свой уровень путем решения всевозможных задач. Чтобы помочь вам в этом, мы отобрали несколько ресурсов с упражнениями.

В первую очередь отметим, что знание английского языка, как и во многих иных жизненных ситуациях, существенно облегчит жизнь в повышении навыков программирования. Ведь большинство порталов, на которых размещены практические задания, англоязычные. Как, к примеру, W3resource.

Целевая аудитория сайта – начинающие web-разработчики. Именно им предназначено солидное количество задач по HTML, PHP, Python, JavaScript, на решение которых можно потратить не один день и даже неделю. Ни регистрации, ни дополнительного инструментария портал не требует: удобство пользования обеспечивает встроенный редактор, а также ссылки на правильные ответы, если решение задачи все же поставило вас в тупик.

Coding Bat

Схожей стратегии придерживается и Coding Bat. Создатели ресурса также предпочли узкую направленность, сконцентрировавшись на упражнениях по Java и Python. Малое разнообразие упражнений с лихвой компенсирует количество и качество задач, а также удобство пользования. Разумеется, опять же, встроенный редактор и ответы. Кроме того, портал подойдет как для начинающих, так и опытных разработчиков.

Code Abbey

Успех любого обучения кроется в правильной мотивации, которая, без сомнения, присутствует в Code Abbey. Так, любой пользователь, решивший 125 задач, может получить соответствующий сертификат. Разумеется, бесплатно. Еще один плюс ресурса – возможность выполнения заданий на практически любом распространенном языке (от C до Julia).

Top Coder

Впрочем, даже такая мотивация не столь действенна, как денежное вознаграждение. Так на Top Coder вы сможете не только повысить свой уровень, но и подзаработать: по факту ресурс представляет из себя список соревнований, победитель которых получит пусть и не поражающую воображение, но приятную награду. Наиболее же успешные участники вдобавок имеют шансы «засветиться». Мастодонты индустрии вроде Microsoft, Facebook или IBM периодически мониторят портал в поисках новых талантов.

Programmr

На данном портале в свое время также можно было участвовать в соревнованиях. Однако к текущему моменту все они потеряли актуальность. Тем не менее, ресурс по-прежнему являет собой богатую площадку для развития навыков. В первую очередь – за счет многочисленных задач по Java, C++, PHP, C#, Ruby, Python и Objective-C. В каждой из них нужно дописать большую часть кода. Как правило, на выполнение задания отводится 30 минут.

Кроме того, на данном ресурсе вы можете создать свой проект и поделиться им с миром – количество просмотров некоторых из таковых переваливает за 100 000.

Programming Skills

Тем же, кто устал от написания кодов и хочет привнести большего разнообразия в учебный процесс, подойдет портал Programming Skills. На нем можно найти серии тестов из 20 вопросов по C, HTML, C#, Java и другим языкам. На выполнение каждого дается 25 минут. Помимо них, на ресурсе содержится богатый перечень вопросов, с которыми вам, возможно, доведется столкнуться на собеседовании.

SQL-EX.RU

Наконец, для изучающих SQL идеально подойдет данный портал. Он предлагает огромное количество задач, охватывающих все типажи запросов. Для мотивации же пользователей введена рейтинговая система всех зарегистрировавшихся посетителей – за каждый верный ответ вы получите определенное число очков. Количество оных зависит от сложности задачи, в чем, к слову, кроется и еще один плюс ресурса. Ведь он подойдет как начинающим (или тем, кому достаточно базовых знаний), так и тем, чья служба невозможна без конструирования сложных запросов.

Единственный, но временами досаждающий минус – отсутствие альтернативных путей. Иными словами: правильность выполнения упражнения определяется не ответом, а методом решения. В результате порой возникают парадоксы, в которых фактически правильный ответ не засчитывается как верный.
Автор: Александр Мороз

Тем, кто только начинает свой путь в кодинге, рекомендуем бесплатный курс по Основам программирования.

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

В обучении программированию действует тот же принцип. Конечно, на GeekBrains вы получите практические задания и помощь преподавателей. Однако и после завершения курсов вы наверняка захотите размять руки, а также повысить свой уровень путем решения всевозможных задач. Чтобы помочь вам в этом, мы отобрали несколько ресурсов с упражнениями.

В первую очередь отметим, что знание английского языка, как и во многих иных жизненных ситуациях, существенно облегчит жизнь в повышении навыков программирования. Ведь большинство порталов, на которых размещены практические задания, англоязычные. Как, к примеру, W3resource.

Целевая аудитория сайта – начинающие web-разработчики. Именно им предназначено солидное количество задач по HTML, PHP, Python, JavaScript, на решение которых можно потратить не один день и даже неделю. Ни регистрации, ни дополнительного инструментария портал не требует: удобство пользования обеспечивает встроенный редактор, а также ссылки на правильные ответы, если решение задачи все же поставило вас в тупик.

Coding Bat

Схожей стратегии придерживается и Coding Bat. Создатели ресурса также предпочли узкую направленность, сконцентрировавшись на упражнениях по Java и Python. Малое разнообразие упражнений с лихвой компенсирует количество и качество задач, а также удобство пользования. Разумеется, опять же, встроенный редактор и ответы. Кроме того, портал подойдет как для начинающих, так и опытных разработчиков.

Code Abbey

Успех любого обучения кроется в правильной мотивации, которая, без сомнения, присутствует в Code Abbey. Так, любой пользователь, решивший 125 задач, может получить соответствующий сертификат. Разумеется, бесплатно. Еще один плюс ресурса – возможность выполнения заданий на практически любом распространенном языке (от C до Julia).

Top Coder

Впрочем, даже такая мотивация не столь действенна, как денежное вознаграждение. Так на Top Coder вы сможете не только повысить свой уровень, но и подзаработать: по факту ресурс представляет из себя список соревнований, победитель которых получит пусть и не поражающую воображение, но приятную награду. Наиболее же успешные участники вдобавок имеют шансы «засветиться». Мастодонты индустрии вроде Microsoft, Facebook или IBM периодически мониторят портал в поисках новых талантов.

Programmr

На данном портале в свое время также можно было участвовать в соревнованиях. Однако к текущему моменту все они потеряли актуальность. Тем не менее, ресурс по-прежнему являет собой богатую площадку для развития навыков. В первую очередь – за счет многочисленных задач по Java, C++, PHP, C#, Ruby, Python и Objective-C. В каждой из них нужно дописать большую часть кода. Как правило, на выполнение задания отводится 30 минут.

Кроме того, на данном ресурсе вы можете создать свой проект и поделиться им с миром – количество просмотров некоторых из таковых переваливает за 100 000.

Programming Skills

Тем же, кто устал от написания кодов и хочет привнести большего разнообразия в учебный процесс, подойдет портал Programming Skills. На нем можно найти серии тестов из 20 вопросов по C, HTML, C#, Java и другим языкам. На выполнение каждого дается 25 минут. Помимо них, на ресурсе содержится богатый перечень вопросов, с которыми вам, возможно, доведется столкнуться на собеседовании.

SQL-EX.RU

Наконец, для изучающих SQL идеально подойдет данный портал. Он предлагает огромное количество задач, охватывающих все типажи запросов. Для мотивации же пользователей введена рейтинговая система всех зарегистрировавшихся посетителей – за каждый верный ответ вы получите определенное число очков. Количество оных зависит от сложности задачи, в чем, к слову, кроется и еще один плюс ресурса. Ведь он подойдет как начинающим (или тем, кому достаточно базовых знаний), так и тем, чья служба невозможна без конструирования сложных запросов.

Единственный, но временами досаждающий минус – отсутствие альтернативных путей. Иными словами: правильность выполнения упражнения определяется не ответом, а методом решения. В результате порой возникают парадоксы, в которых фактически правильный ответ не засчитывается как верный.
Автор: Александр Мороз

Тем, кто только начинает свой путь в кодинге, рекомендуем бесплатный курс по Основам программирования.

Телеграм канал С# Start 1.0

Статистика telegram канала @csharp_start

�� 7929 место в рейтинге каналов -54

�� Количество подписчиков на сегодня 502
Прирост за 24 часа -2 подписчиков или падение на -0.40 %

�� Приблизительная цена канала С# Start 1.0

�� Пессимистическая $ 150.6
�� Оптимистическая $ 2510

Читайте популярные записи в канале С# Start 1.0 онлайн

Потоки для начинающих

Технология разработки программного обеспечения

8 заданий по C#, которые могут попасться на собеседовании

​В какой строке ошибка?

1️⃣ 4️⃣ Урок. Объектно-ориентированное программирование.

Windows Forms. BindingSourse. BindingNavigator. DataGridView. Month Calendar. Сериализация и десериализация XML

В конце методического пособия есть практические домашние задания, которые необходимо выполнить для полного усвоения материала.

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

​Одним из самых интересных способов протестировать и прокачать свои it-skills являются хакатоны. Они представляют собой марафоны программирования, где участники сталкиваются в лоб с реальными задачами, решение которых нужно отраслям. Кроме бесценного опыта, можно выиграть приз и найти единомышленников.

Hackathons Announces — это канал комьюнити Russian Hackers, где рассказывают про все самые интересные хакатоны и другие мероприятия из мира IT.

​Небольшой тест перед сном. Что будет выведено в результате выполнения программы?

Искусственный интеллект и нейросети для .NET-разработчиков

В этой статье рассказывается, как .NET-разработчики могут использовать возможности ИИ в своих проектах: начиная от готовых когнитивных сервисов, работающих в облаке, заканчивая обучением нейросетей на .NET-языках и запуском сложных нейросетевых моделей на компактных устройствах типа Raspberry Pi.

. Урок. Объектно-ориентированное программирование.

Абстрактные классы. Интерфейсы. Стандартные интерфейсы.

В конце методического пособия есть практические домашние задания, которые необходимо выполнить для полного усвоения материала.

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

10 полезных Git команд, которые облегчат работу

За последние несколько лет популярность git возросла, что позволило этой системе стать наиболее распространенной. Она используется разными программистами и командами разработчиков, начиная небольшими опен-сорс проектами и заканчивая linux kernel. Существует большое количество Git команд, которые важно знать. Давайте же разберем топ Git команд.

В чём разница между string и String в C#?

​​ . Достаточно простой и эффективный алгоритм распознавания и сопровождения движения

В результате появился алгоритм для обработки последовательности кадров, содержащих отображения движущихся объектов, например транспортных средств (ТС).

Исследуем возможности C# 7

CsConsoleFormat: форматирование в консоли по-новому (.NET)

▫️Требования:
— опыт работы 1-2 года
— английский язык технический
— уверенное знание C#, .NET
— опыт многопоточного программирования
— знание БД MS SQL на уровне написания хранимых процедур
— умение спрогнозировать и выдерживать сроки разработки
— умение писать красивый, понятный и легко поддерживаемый код
— умение отслеживать причины ошибок на большом количестве уровней (от браузера до БД)
— широкий кругозор в области информационных технологий
— умение работать как по ТЗ, так и без него (Разработчик-аналитик)

▫️Дополнительные навыки:
— опыт разработки высоконагруженных, масштабируемых систем
— умения самостоятельно проводить исследования и технический анализ
— участие в разработке систем, автоматизирующих бизнес-процессы организации (желательно в области систем документооборота и workflow-систем)

Дополнительные материалы к 13 уроку:

Преобразование цветного изображения в черно-белое

Дополнительные материалы к 13 уроку:

Оцените наше обучение?

43% Все отлично .
34% Хорошо, но есть недочеты .
21% Ожидал большего .

ASP.NET Core: Механизмы предотвращения атак 2.0

Создание инсталлятора в Visual Studio

3️⃣ Урок. Методы. От структур к объектам. Исключения. Работа с файлами.

Подробнее о методах. От структур перейдем к объектам. Научимся считывать данные из файла и ловить исключения.

В конце методического пособия есть практические домашние задания, которые необходимо выполнить для полного усвоения материала.

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

Мы запускаем первый конкурс с денежным призом. Победителем может стать каждый из Вас. Остается дело за малым. Итак, что же требуется сделать, чтобы стать победителем.

Вы должны реализовать на языке программирования C# следующее задание:

Первый, кто правильно решит задачу, получит денежный приз в размере 1000 рублей. Решение отправлять на почту csharp_[email protected], либо файл с исходным кодом, либо ссылку на Github репозиторию с исходным кодом. Также в сообщении напишите свой ник в Telegram, например: @jn8momotov. Конкурс продлится до 6 марта.

Поторопитесь, победитель только один — самый первый!
Всем удачи! ✌️

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

Кто первый пришлет правильное решение задания, получит от Нас денежный приз! . Завтра днем выложим условие задачи и все подробности. Но а сейчас отдохните, возможно завтра Вам придется попотеть .

Ждите завтра .
До скорого.

На сегодняшний день GitHub – это один из самых популярных сервисов для совместной разработки программного обеспечения и его хостинга в облаке. Крупные IT-компании, такие как Microsoft, Google, Facebook и многие другие, используют данный ресурс для размещения исходных кодов своих разработок. Вы наверняка слышали о GitHub – пришло время научиться им пользоваться!

Прошло меньше суток, а уже есть победитель. Им становится @Protoss_OP. В ближайшее время мы свяжемся с победителем и переведем ему денежный эквивалент.

Остальные не расстраивайтесь и ждите новых конкурсов!
Дальше — больше .

1️⃣ 1️⃣ Урок. Объектно-ориентированное программирование.

Обобщения. Делегаты и события. Паттерн «наблюдатель».

В конце методического пособия есть практические домашние задания, которые необходимо выполнить для полного усвоения материала.

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

Практика по массивам

Для всех, кто желает больше практики, прорешайте весь раздел «Массивы». Помимо задач имеются теория и видеоуроки. Если решение задач окажется для Вас сложным — воспользуйтесь подсказками, но рекомендуем все-таки решать самим.

Лучшие проекты, в которых стоит поучаствовать, чтобы примкнуть к Open Source движению и развить свои навыки

8 заданий по C#, которые могут попасться на собеседовании

Выгрузка сообщений с использованием Telegram API

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

1. Структура данных и алгоритмы.
Для начала стоит обратить внимание на структуру данных и алгоритмы. Казалось бы мелочи и можно всегда все быстренько найти в интернете, но с этого все и начинается. Разница между специалистом знающим алгоритмы, и не знающим — очень видна. Когда будете знать многие базовые алгоритмы, начнете чувствовать себя по-другому.

2. База данных
Далее стоит обратить особое внимание за СУБД. Наиболее часто используемая SQL Server. Если еще не знаком с базами данных, позже скинем вам грамотный контент. T-SQL — язык запросов в SQL Server. Основные функции: SELECT, INSERT, UPDATE, DELETE, JOIN и GROUP BY. Стоит также обратить внимание на Entity Framework, например, для работы с объектами в базе данных.

Мастер Йода рекомендует:  Как найти ментора в IT-сфере и откуда начать поиски

3. Веб-разработка
Здесь у нас имеются backend, frontend и full-stack разработчики. Для frontend надо познакомиться с HTML, CSS и JavaScript. Backend — это ASP.NET MVC (фреймворк для создания серверных приложений)

4. Desktop-разработка
Если вы хотите заняться разработкой приложений под Windows, то этот пункт именно для вас. Большинство заданий потребует от вас знания XAML, WPF или Windows Forms.

Направление Вам дали, теперь дело остается за вами. Определиться чем вы хотите заниматься. И следуйте к своей мечте. Всем доброй ночи!

Нейронные сети на C#

Хорошая подборка видео, как написать нейронную сеть на C#. Состоит из 8 частей.

Как понять программиста: ТОП важных вещей о программировании

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

Вопросы на собеседовании по C#

Самые популярные и задаваемые вопросы на собеседованиях .Net разработчика.

Общие вопросы

В чем разница между интерфейсно-ориентированным, объектно-ориентированным и аспектно-ориентированным программированием?

Аспектно-ориентированное

Аспектно-ориентированное програмирование базируется на изучении того сколько и каких компонент или частей требуется для взаимодействия с системой. Основным для АОП является взаимодействие этих элементов.

Интерфейсно-ориентированное

Интерфейсно-ориентированное программирование это подход основанный на программировании по контракту. Ни одна часть интерфейса не зависит от того как реализована другая, вся коммуникация между ними описана в контракте. Веб-сервисы на основе WSDL наиболее известный пример этого подхода.

Объектно-ориентированное

Объектно-ориентированное программирование основывается на понятиях абстракции, инкапсуляции, полиморфизма и наследования. Классы реализуют эти концепции для построение объектов, контролирующих или реализующих систему.

Абстракция позволяет уменьшить связывание между компонентами пердоставляя дополнительный слой между ними, для того чтоб один объект не зависил от того, как другой реализуюет свои бизнес-правила. (Интерфейсы, слои) Отличная штука, если вы хотите изолировать части системы так, чтоб их изменение или замена не стали проблеммой для работы системы в целом.

Инкапсуляция позволяет работать абстракции пряча детали реализации класса от вызывающих его. (Публичные и приватные поля)

Наследование позволяет базовым(родительским) классам содержать общую функциональность и передавать ее всем своим классам-потомкам. Класс Figure(фигура) может иметь поле цвет, которое будет унаследовано его классами-потомками Square(квадрат) или Circle(круг).

Полиморфизм позволяет реализовывать одноименные публичные методы, позволяя различным классам выполнять различные действия при одном и том же вызове. То есть объекты классов Square и Circle могут отображаться(реализовывать метод render) поразному несмотря не то, что они оба подклассы Shape, метод render определен в Shape. (Overriding)

Что такое CLR? Что такое IL? Что такое CLS?

CLR («Common Language Runtime», «общеязыковая исполняющая среда») — это компонент .NET Framework, основной задачей которого является управление интерпретацией и исполнением кода IL. CLR отвечает за изоляцию памяти приложений, проверку типов, безопасность кода, преобразование IL в машинный код.

IL (Intermediate Language) — код, содержащий набор инструкций, не зависящих от платформы. Иными словами, после компиляции исходного кода он преобразуется не в код для какой-то определенной платформы, а в промежуточный код на языке IL.

CLS («Common Language Specification», общеязыковая спецификация) — это набор правил, следуя которым разработчики достигают бесконфликтной работы во всех языках .NET.

Что такое managed code?

Управляемый код (managed code) — это код, работающий в среде CLR. Содержит метаданные, в которых находится информация для среды выполнения — о типах, членах и ссылках, используемых в коде.

Что такое assembly?

Сборка (assembly) — один или несколько файлов, содержащий логический набор функциональности (код и другие данные, связанные с кодом). Бывают статические сборки, хранящиеся на диске, и динамические, которые создаются во время выполнения программы. Сборка — это базовый блок приложения, все ресурсы, относящиеся к ней, доступны или только внутри этого блока, или экспортируются наружу. При выполнении сборка задает область видимости имен и следит за ее соблюдением.

Что такое приватные и совместные сборки?

Сборки (assembly) бывают двух типов — приватные (private), которые использует только само приложение, и совместные (shared), использующиеся набором приложений. При приватных сборках приложение изолируется от внешнего воздействия программ и операционной системы, отпадает необходимость заботиться об уникальности имен в глобальном пространстве имен. Чтобы сделать сборку совместной, ее необходимо специальным образом собрать и присвоить ей строгое шифрованное имя.

Что такое assembly manifest?

Манифест сборки (assembly manifest) — это внутренняя часть сборки, которая позволяет ей быть самоописанной. Assembly manifest позволяет идентифицировать сборку, указывает файлы, которые включаются в реализацию сборки, описывает типы и ресурсы, используемые в сборке, указывает зависимости от других сборок, а также набор прав доступа, которые необходимы сборке для корректной работы. Эта информация используется во время выполнения для разрешения ссылок, проверку корректности версий, проверку целостности загруженных сборок.

В чем разница между понятиями namespace и assembly?

Namespace (пространство имен) является логическим соглашением, используемым во время разработки, в то время как assembly (сборка) устанавливает область видимости имени в процессе выполнения.

В чем различие между Value Type и Reference Type?

Value Type находятся в стеке, а Reference Type в куче.

Когда объект удаляется сборщиком мусора?

Объект удаляется сборщиком мусора, когда на него не остается ссылок.

Что такое Code Access Security (CAS)?

CAS — это защитная технология, позволяющая установить ограничение на исполнение управляемого кода. Таким образом можно определить разрешения и установить права доступа к ресурсам компьютера.

Что такое attribute?

Атрибут (attribute) — это универсальное средство связи данных с типами, позволяют добавлять любую текстовую информацию о классах, свойствах, методах и т.д. Атрибуты сохраняются с метаданными и могут быть получены при выполнении программы.

Как обеспечить использование именованных параметров в конструкторе атрибута?

Конструкторы атрибутов могут принимать именованные параметры — поля и свойства атрибутов. При задании именованного параметра в конструктор атрибута передается имя свойства или поля, которое должно принять этот параметр. При чем эти свойства и поля должны быть открытыми. Если именованные параметры передаются, то они обязательно должны идти следом за позиционными параметрами, которые явно указаны в конструкторе атрибута. Указание именованных параметров не является обязательным, поэтому при проектировании атрибутов необходимо помнить о том, что некоторые его поля или свойства могут быть не проинициализированы. Пример использования именованных параметров в конструкторе атрибута:

Здесь передается 1 позиционный параметр — строка «Kernel32» и 2 именованных параметра, которые устанавливают открытые поля CharSet и SetLastError в значения CharSet.Auto и true соответственно.

В чем различие между Finalize и Dispose?

Dispose — обеспечивает явный контроль над ресурсами, используемыми объектом, а Finalize — неявный, используемый сборщиком мусора.

Что такое Boxing и Unboxing?

Упаковка (boxing) позволяет преобразовать размерный тип в ссылочный. При упаковке объекта размерного типа происходят следующие действия:

  1. Выделяется память в управляемой куче.
  2. Совершается копирование полей размерного типа в память, которая была выделена в куче.
  3. Возвращается адрес объекта.

Некоторые компиляторы автоматически создают IL-код, необходимый для упаковки объекта размерного типа. Процесс извлечения адреса полей из упакованного объекта называется распаковкой (unboxing). Распаковка не является полной противоположностью упаковке. В отличие от упаковки при распаковке не происходит никакого копирования. Однако обычно вслед за распаковкой следует копирование полей, поэтому обе операции (распаковка и копирование) являются противоположностью операции упаковки. Приведем пример использования упаковки и распаковки.

Упаковка и распаковка/копирование снижают производительность приложения как в плане замедления, так и в расходе дополнительной памяти, поэтому нужно стараться минимизировать создание кода, в котором происходят операции упаковки и распаковки/копирования.

Что такое GAC?

GAC — это глобальный кэш сборок. В нем хранятся совместно используемые сборки. Обычно это каталог С:\Windows\Assembly\GAC. Этот каталог имеет определенную структуру, в котором хранятся подкаталоги, имена которых сгенерированы по определенному алгоритму. В GAC можно поместить только сборки со строгими именами. Для того, чтобы поместить сборку в GAC, используют специальный инструмент GACUtil.exe, который знает всю внутреннюю структуру GAC и может генерировать имена подкаталогов надлежащим образом. Регистрировать в GAC сборки необходимо для того, чтобы избежать конфликтов имен сборок. Приведем пример: две компании выпустили сборку и назвали ее одним именем Calculus. Если мы скопируем эту сборку в каталог, в котором уже находится сборка с таким же именем, то мы затрем сборку, которая ранее могла использоваться каким-то приложением. Это приложение с новой сборкой теперь работать не сможет. Решением этой проблемы будет регистрация этих двух сборок в GAC, в котором для каждой будет создан отдельный каталог.

Какие типы можно использовать в предложении foreach?

Массивы, коллекции. Классы в которых реализован интерфейс System.Collections.IEnumerable.

В чем различие между классом и структурой?

Для С# классы System.Object, System.Exception, System.File-Stream и System.Random — это ссылочные типы (память выделяется из упр. кучи). В свою очередь размерные типы в документации называются структурами (structure) и перечислениями (enumeration). Например, структуры System.In132, System.Boolean, System.Decimal, System.TimeSpan и перечисления System.DayOfWeek, System.10.FileAttributes и System.Drawing.FontStyle являются размерными типами (хранятся обычно в стеке потока, но могут быть встроены в ссылочные типы).

Что означает модификатор virtual?

При наследовании класса. Данный метод м.б. переопределен в производных классах с помощью ключевого слова override.

Чем отличается event от delegate?

Delegate – это по сути указатель на функцию.

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

Может ли класс реализовать два интерфейса, у которых объявлены одинаковые методы? Каким образом?

Поддерживает ли C# множественное наследование?

С# поддерживает множественное наследование в виде наследования от класса и нескольких интерфейсов, или просто от нескольких интерфейсов.

Но не поддерживает наследование от нескольких классов.

Кому доступны переменные с модификатором protected на уровне класса?

Наследуются ли переменные с модификатором private?

Да, но они не являются доступными.

Опишите модификатор “protected internal”

Члены с таким модификатором доступны классам, находящимся в той же сборке и унаследованным от данного класса.

Назовите класс .NET, от которого наследуются все классы?

Что обозначает термин immutable (неизменяемый)?

Это значит, что данные, хранящиеся в переменной, не могут быть изменены. При этом заметьте, что значение переменной может быть изменено — путём отказа от использования старых данных, которые могут быть изменены. Оригинальные данные остаются в памяти, а новые значения создаются вновь, в новой области памяти. Пример тип String.

Какая разница между классами System.String и System.Text.StringBuilder?

Данные, хранящиеся в классе System.String и есть неизменяемые (immutable). Класс System.StringBuilder разрабатывался так, чтобы над изменяемой строкой можно было проделать множество операций. То есть при каждой операции над объектом класса System.String происходит перенос данных в новую область памяти, что влияет на производительность программы.

Какое преимущество использования класса System.Text.StringBuilder перед System.String?

Класс StringBuilder более эффективен в случае работы с большим количеством строк. Объекты класса System.String неизменяемы, поэтому при каждом изменении строки создаётся новый объект в памяти.

Можно ли хранить разные типы данных в объекте класса System.Array?

Объясните разницу между System.Array.CopyTo() и System.Array.Clone()?

Первая операция осуществляет глубокое копирование массива, а вторая – поверхностное. Поверхностное копирование массива копирует только сами элементы объекта класса Array, независимо от того являются они ссылочными или значимыми типами. Копирования объектов, на которые ссылаются ссылочные типы не происходит. Ссылки в новом объекте класса Array указывают на те же объекты, что и ссылки в оригинальном массиве Array. Глубокое копирование копирует как элементы класса Array, так и объекты, на которые они явно или неявно ссылаются.

Как отсортировать элементы массива в убывающем порядке?

Нужно вызвать метод Sort(), а затем метод Reverse().

As, is – что это, как применяется?

If(o is Employee)<

Employee e = (Employee) o;

Проверка типа осущ., 2-ды. По этому в CLR

Employee e = o as Employee;

Вопросы по классам

Какой синтаксис используется для указания класса родителя в C#?

После имени класса наследника нужно поставить двоеточие и указать имя базового класса. Пример:

Можно ли запретить наследование от своего собственного класса?

Да. Для этого служит ключевое слово “sealed”.

Можно ли разрешить наследование класса, но запретить перекрытие метода?

Да. Указываем класс как public, а метод как sealed.

Что такое абстрактный класс?

Это класс, объект которого не может быть создан. Такой класс должен иметь класс-наследник с реализацией абстрактных методов. Абстрактный класс – это фактически чертёж нормального класса без реализации.

В каком случае вы обязаны объявить класс абстрактным?

  1. В том случае, если класс является наследником абстрактного класса, но не все методы базового класса перекрыты и имеют реализацию.
  2. В том случае, если хотя бы один метод класса является абстрактным.

Что такое интерфейс класса?

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

Почему нельзя указать модификатор видимости для методов интерфейса?

Потому что все они должны иметь модификатор public, который и установлен по умолчанию.

Можно ли наследовать от нескольких интерфейсов?

Назовите отличия между интерфейсом и абстрактным классом?

В интерфейсе все методы (свойства и т.д.) абстрактны и не имеют реализации. В абстрактном классе некоторые методы могут быть реализованы. В интерфейсе члены не могут иметь модификатора видимости (все они являются public по умолчанию), а в абстрактном классе члены могут иметь модификатор видимости.

Назовите различия между структурами и классами.

Для С# классы System.Object, System.Exception, System.File-Stream и System.Random — это ссылочные типы (память выделяется из упр. кучи). В свою очередь размерные типы в документации называются структурами (structure) и перечислениями (enumeration). Например, структуры System.In132, System.Boolean, System.Decimal, System.TimeSpan и перечисления System.DayOfWeek, System.10.FileAttributes и System.Drawing.FontStyle являются размерными типами (хранятся обычно в стеке потока, но могут быть встроены в ссылочные типы).

В чем разница между абстрактными и виртуальными классами? Между виртуальными и абстрактными методами?

Абстрактный класс это класс, содержащий хотя бы один метод (abstract).. Виртуальный метод имеет реализацию и м.б. переопределен в производном классе. Абстрактный метод не имеет реализацию, только описание метода, который д.б. реализован в производных классах.

Dispose(), Finalize() – что это за методы, как используются в .NET?

Используются для освобождения ресурсов. Применяя метод Dispose, вы должны обеспечить неявную очистку методом Finalize. Если программисту не удалось вызвать метод Dispose, использование метода Finalize предотвращает постоянную утечку ресурсов.

Для чего в .NET используется конструкция using(…)<…>? Причем тут IDisposable?

Значение Using непосредственно связано с интерфейсом IDisposable. Интерфейс IDisposable представляет нам возможность быстро освободить общие ресурсы, не полагаясь на автоматический сборщик мусора (garbage collector). Конструкция Using позволяет вызывать метод Dispose автоматически, как только нужный объект выйдет за блок Using.

Вопросы по методам и свойствам

Назовите явное имя параметра, передаваемого в метод set свойства класса?

value. Тип этого параметра определяется типом свойства.

Что обозначает ключевое слово “virtual” для метода или свойства?

То, что метод или свойство может быть перекрыто.

Чем перекрытый метод отличается от перегруженного метода?

При перекрывании метода мы изменяем его поведение в классе наследнике. Перегрузка метода просто приводит к использованию другого метода с тем же именем внутри класса.

Можно ли объявить перекрытый метод статическим, если перекрываемый метод не является статическим?

Нет. Сигнатура виртуального метода должна остаться постоянной, кроме замены ключевого слова virtual на ключевое слово override.

Вопросы по сборкам

Что такое «сопутствующая сборка» (satellite assembly)?

Сборки, помеченные определенными региональными стандартами, называются сателлитными сборками

Какая наименьшая исполнимая единица в .NET?

Что происходит в памяти при упаковке и распаковке значимого типа?

При упаковке экземпляра размерного типа происходит следующее.

  1. В управляемой куче выделяется память. Ее объем определяется длиной размерного типа и некоторыми накладными расходами, позволяющими этому размерному типу стать настоящим объектом. Этими накладными расходами являются указатель на таблицу методов и индекс SyncBlocklndex.
  2. Поля размерного типа копируются в память, выделенную только что в куче.
  3. Возвращается адрес объекта. Этот адрес является ссылкой на объект; размерный тип превратился в ссылочный.

Распаковка не является точной противоположностью упаковки.

Она состоит только в получении указателя на исходный.

размерный тип (поля данных), содержащийся в объекте. И никакого копирования при распаковке (в отличие от упаковки). Однако обычно вслед за распаковкой выполняется копирование полей, поэтому в сумме обе эти операции являются отражением операции упаковки

Тестовые задания по C#?

Решаешь задачу, тесты проверяют корректность решения, после можно посмотреть как другие решили. По итогам выдают очки (видимый прогресс повышает мотивацию), по мере «прокачки» предлагают всё более сложные задачки (впрочем, никто не мешает сразу замахнуться на что-то трудное). Есть и C# и много других языков. Ну и публичный профиль потом можно в резюме показать:)

Я делал так. Сказал себе «Хочу написать клиент-сервер, который передает изображение рабочего стола одного компьютера на другой» и побежал в гугл, а оттуда на киберфорум, стэковерфлоу и.т.п. И написал, попутно разбираюсь как реализовать ту функцию или ту. А что будет если я сделаю не как в примере, а вот так ну и тому подобное. Потом сказал «Хочу написать автоапдейтер резюме на hh.ru» ну и алгоритм описан выше 🙂

Мне просто было это интересно, и это мотивировало разбираться с языком для решения моей задачи. Тестовые задания я не осилил делать в силу лени и не интересности. Хотя подход в целом можно назвать корявым.)

Список вопросов C# Собеседование

  1. Что такое кластеризованный и некластеризованный индекс? Когда какое надо использовать?
  2. Что такое Join? Чем он отличается от Left Join, Right Join? Inner Join? Outer Join?
  3. Есть три таблицы: CUSTOMERS (ID, NAME, MANAGER_ID); MANAGERS (ID, NAME); ORDERS (ID, DATE, AMOUNT, CUSTOMER_ID). Написать запрос, который выведет имена Customers и их SalesManagers, которые сделали покупок на общую сумму больше 10000 с 01.01.2013.
  4. Делаем электронный справочник по книгам. Ищем:
    А) В каком магазине купить данную книгу.
    Б) В каких магазинах купить книги этого автора (авторов).
    В) Кто автор книги.
    Г) Какие книги написал автор.
    Нарисовать БД. Написать запрос Б. (Не забыть учесть, что у одной книжки — может быть несколько авторов)
  5. Что такое агрегирующие функции? Операторы Group By, Having? Приведите примеры их использования.
  6. Table «PC» (id, cpu(MHz), memory(Mb), hdd(Gb))
    1) Тактовые частоты CPU тех компьютеров, у которых объем памяти 3000 Мб. Вывод: id, cpu, memory.
    2) Минимальный объём жесткого диска, установленного в компьютере на складе. Вывод: hdd.
    3) Количество компьютеров с минимальным объемом жесткого диска, доступного на складе. Вывод: count, hdd.
  7. Дана следующая структура базы данных в MS SQL: Departments (Id, Name), Employees(Id, DepartmentId, Name, Salary).

• Написать запрос получения имени одного сотрудника, имеющего максимальную зарплату в компании, и название его отдела.
• Получить список отделов, средняя зарплата в которых больше 1000$.

  • Ado Net – что за технология? и как и когда она используется?
  • Что такое Entity Framework? Какие подходы проектирования БД знаете? Расскажите про Code First.
  • Конечно вопросы про ООП.

    1. Назовите и объясните основные парадигмы ООП.
    2. Назовите преимущества объектно-ориентированного подхода к программированию перед структурным программированием.
    3. Перечислите недостатки ООП парадигмы.
    4. Что такое раннее и позднее связывание?
    5. Перечислите модификаторы доступа и когда они используются?

    Вопросы про паттерны проектирования.

    1. Расскажите про SOLID и примеры его использования.
    2. В чем отличие паттерна «Стратегия» от паттерна «Шаблонный метод»?
    3. Паттерн Адаптер и его применение.
    4. Расскажите про паттерн «Фасад».

    Ну и конечно, огромное количество вопросов по С#.

    1. using (Some > Что делает данная конструкция?
    2. int i = 1;
      Console.WriteLine(«i = <0>», ++i);
      Что выведет данный код?
    3. Различие класса и структуры? И что будет если их передать в метод в виде параметров?
    4. Задача: есть нули и единицы в массиве. Надо для каждого нуля посчитать сколько единиц правее него и вывести сумму таких чисел. Сделать за один проход.
    5. Различие абстрактного класса и интерфейса? Можно ли отказаться от интерфейсов и использовать только абстрактный класс, ведь мы можем в абстрактном классе просто указать сигнатуры методов?
    6. Что такое интернирование строк?
    7. Расскажите про интерфейс IEnumerable? Зачем он используется?
    8. Когда мы можем пройтись по собственной коллекции foreach- ом? Что для этого надо сделать и почему? (Рассказать про утиную типизацию)
    9. Различие между IEnumerable and IQueryable?
    10. Как устроен Dictionary внутри? Как борются с коллизиями?
    11. Есть обычный пользовательский класс. Нужно его использовать как ключ в Dictionary. Что для этого надо поменять (добавить) в классе?
    12. Какова алгоритмическая сложность для операций чтения и записи для коллекции Dictionary?
    13. В чем различие между ключевыми словами «ref» и «out»?
    14. Расскажите, как работает try, catch, finally? Когда вызывается каждый?
    15. Чем отличаются друг от друга классы String и StringBuilder? Зачем нужно такое разделение?
    16. Какие отличие между значимыми и ссылочными типами? Зачем придумали такое разделение? Нельзя было придумать только либо значимые либо ссылочные?
    17. В чем отличие использования Finalize и Dispose?
    18. Что такое управляемый код и CLR? Основные требования к управляемому коду?
    19. Что такое assembly manifest (манифест сборки)?
    20. Что такое Boxing и Unboxing?
    21. В чем суть полиморфизма?
    22. Чем отличается event от delegate?
    23. Может ли класс реализовать два интерфейса, у которых объявлены одинаковые методы? Если да, то каким образом?
    24. Что такое абстрактный класс? В каком случае вы обязаны объявить класс абстрактным?
    25. В чем разница инкапсуляции и сокрытия?
    26. Что такое частные и общие сборки?
    27. Что такое .Net Framework?
    28. LINQ lazy loading, eager loading в чем разница?
    29. Можно ли запретить наследование от своего собственного класса?
    30. Определение паттерна синглтон.
    31. Что такое интеграционные тесты и unit-тесты?
    32. Что такое MVC, MVVM, WEB API?
    33. Каким образом можно присвоить значения полям, которые помечены ключевым словом readonly?
    34. Когда вызывается статический конструктор класса?
    35. Чем отличаются константы и поля, доступные только для чтения?
    36. Чем отличаются константы и поля, доступные только для чтения?
    37. Разница между асинхронностью и параллельностью?
    38. У вас есть сайт, вы заметили что он долго отвечает, как вы будете искать причину?

    Ну и как же без логических задач:

      Вы находитесь в пустом поезде. Это даже не поезд, а просто вагоны, они сцеплены друг с другом. Все вагоны внутри одинаковы, двери на выход из вагона закрыты, через окна ничего не видно. Вы можете включать и выключать свет в вагоне, в котором находитесь, можете сходить в соседний вагон, там тоже можно включать или выключать свет. Вам известно, что вагоны стоят на кольце и сами сцеплены в кольцо, первый вагон сцеплен с последним, ходить по кругу можно сколько угодно. В момент начала решения задачи в каких-то вагонах свет уже горит, в каких-то — не горит.

    Ваша задача при помощи управления светом в вагонах и перемещения по ним узнать сколько в этом кольце вагонов.

  • У вас есть 100 монет по одному рублю. Они все лежат на столе. У вас также есть два носка. Вам нужно распределить все монеты по 2 носкам, так чтобы в одной из них было в два раза больше монет, чем во второй, при этом:
    • не разрешается ломать их (они должны остаться целыми);
    • надо использовать все 100 монет (прятать нельзя);
    • они все одинаковые (по весу, по виду).
  • Также в одной компании дали готовый пользовательский класс. Мне нужно было найти логические и синтаксические ошибки. К сожалению, это задание мне не дали с собой взять после собеседования и из-за этого не могу опубликовать, но я помню, что там можно было докопаться практически к каждой строчке!

    В другой компании, попросили спроектировать базу данных для приложения вроде «Инстаграмм». Потом попросили написать сигнатуру метода «Upload», который отправляет фото на сервер.

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

    Другая компания решила дать интересную задачу. Я думаю, что это часть задачи, которую решают внутри компании. Решили проверить, как решают другие. Вот как она звучит:

    Реализовать программу анализа текста. Входной текст произвольный и может быть большим по объему. Количество и содержание метрик определяется самостоятельно. Требования к алгоритму: Программа должна быть расширяема к изменению списку метрик. Масштабируемость. На что обращаем внимание и что анализируем:

    1. Какие метрики предложены кандидатом и их смысл — аналитическое мышление
    2. SOLID анализ предложенного решения — навыки проектирования
    3. Какие шаблоны применены для масштабируемости и расширяемости — архитектурные скилы кандидата. повод при общении затронуть более глубоко вопрос проектирования
    4. Какие синтаксические конструкции языка применены и какая технология используется — использование сахара и средств упрощения кода
    5. Написаны ли unit тесты — что и как тестирует, какие фреймворки и стили тестов использует
    6. Сравнение с когнитивными сервисами — знание трендов применения технологий в реальных проектах
    7. Время, сложность решения, активность дополнительных вопросов выполнения — заинтересованность к решаемым задача/получению оффера

    Также хочется отметить тот факт, что в своем резюме я указал, что занимаюсь олимпиадным программированием и это очень положительно повлияло на ход многих собеседований. Меня просили рассказать, что это такое. Меня удивило, что большинство интервьюверов не знали про такое движение в программировании. Те, кто знали, просили меня реализовать какие-нибудь сортировки (пузырьковая, вставками, qsort), задачи с олимпиадного программирования. Я считаю, что алгоритмы и структуры данных дают огромный плюс в жизни программиста и теперь как оказалось еще и при трудоустройстве.

    Также положительным фактом оказалось преподавание информатики в ВЦНМО. Расспрашивали каково преподавать и трудно ли объяснять сложные вещи на пальцах.

    Для меня было неожиданностью, что меня пригласили работать практически все компании (80%), в которых я проходил собеседование. Может это чувство из-за моей низкой самооценки?! После прохождения собеседований, с уверенностью могу сказать, что это несложно, а даже легко и интересно. Так что друзья, не бойтесь собеседований и крупных компаний, будьте самоуверенными, верьте в свои силы и все будет на 5!

    Для тех, кто будет готовится или уже готовится к собеседованиям, ниже перечислю ссылки, которые помогут вам (по моему мнению) подготовится к собеседованию на должность Junior C# Developer, .Net Developer.

    Задачи на собеседованиях #197

    Содержание статьи

    Наши старые друзья из IT-компании CUSTIS, когда-то одними из первых разместившие задачи в нашей тогда еще новорожденной рубрике, решили вновь порадовать нас хорошей порцией квестов. Ну а DZ Systems прислали нам решения задач, выложенных на суд читателей в апрельском номере, и мы их тоже с удовольствием опубликуем.

    О компании CUSTIS

    Команда CUSTIS уже почти двадцать лет проектирует, разрабатывает и внедряет масштабные IT-системы для крупнейших российских банков, торговых сетей и государственных организаций. Две трети сотрудников компании — разработчики, аналитики, инженеры и проектировщики, работающие над нестандартными и порой уникальными задачами по созданию Enterprise-систем для автоматизации учета, отчетности, продаж и логистики. Основные технологии — Java, .NET и Oracle, им и посвящены задачки.

    Читателям, приславшим правильные ответы, CUSTIS обещает полезные подарки и возможность пройти собеседование в московском офисе компании.

    Свежая порция задач от компании CUSTIS

    Читатели, шлите ваши ответы!

    Правильные ответы принимает Ольга Чехунова: ochekhunova@custis.ru

    Задача для разработчиков Oracle

    Разработчик баз данных в свой первый рабочий день в компании обнаружил, что в его проекте используется всего одна табличка с данными по отгруженным товарам (Т). В ней собираются данные по дате отгрузки (d), идентификационному номеру клиента (c) и количеству отгруженного товара (s). Разработчик проверил и убедился, что никаких ключей в таблице нет и по одному клиенту может быть сколько угодно фактов отгрузки в один день.

    Почувствовав облегчение от того, что не придется возиться со страшными запросами, разработчик пошел на кухню выпить кофе и перекусить фруктами. После возвращения он с легким сердцем схватил первый же инцидент со Scrum-доски и прочитал следующее: «Нужен отчет по ежедневным отгрузкам товара по выбранному клиенту». Посоветовавшись с товарищами, он выяснил, что отчеты принято оформлять в виде view (представления), то есть для решения проблемы нужно сделать такой view, чтобы запрос

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

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

    Как вы думаете, какой view в результате получился у нашего разработчика?

    Задача для разработчиков C#

    За день до релиза отдел тестирования обнаружил, что отчет об остатках товара формируется около часа. Вам была поручена задача оптимизировать процесс создания отчета. Профилировщик показал, что в коде

    метод atlasClient.GetRests занимает около 98% общего времени построения отчета.

    Предложите вариант оптимизации построения отчета. Почему ваш вариант работает быстрее? Сколько времени занимает построение отчета после вашей оптимизации?

    Задача для разработчиков Java

    Разработчик C# решил попробовать себя на поприще Java и перешел в Java-проект. Одно из первых заданий, которое он получил, — сделать таблицу с информацией о проданных товарах. В постановке задачи было написано, что нужны следующие столбцы: имя клиента, код клиента, название товара и стоимость товара. Посмотрев на реализацию такого рода таблиц в проекте, он понял, что при настройке таблицы придется написать что-то вроде

    Прямо скажем, по сравнению с тем, как он делал это на родном dotNet, это выглядело совсем ненадежно — никаких проверок уровня компиляции, очень легко допустить ошибку. Хочется написать

    а тут такое. Код получается небезопасный, IDE никак не подсказывает, что писать, и вообще. Решив не сдаваться и привнести свет истины в захолустное царство Java, он объяснил проблемы такой настройки таблиц другим Java-разработчикам. Ему отвечали, что проект ведется на Java 7, лямбд нет, а с анонимными классами для каждого поля настройка будет выглядеть жутко, поэтому пишем как можем. Но, найдя единомышленников в стане Java, он смог реализовать движок, который позволял настраивать столбцы вот так:

    Причем интерфейс настройки таблиц менять не пришлось, то есть на вход table.add приходит все та же строка customer.name. Не пришлось менять и модельные сущности («покупатель», «товар», «покупка» и другие) и даже не понадобилось никаких автогенерированных классов. Этот инструмент начали использовать везде, где нужно было сослаться на цепочку свойств.

    Как бы вы реализовали такой фреймворк? Важен только принцип, код писать не нужно.

    Решение задач от DZ Systems

    IT-компании, шлите нам свои задачки!

    Миссия этой мини-рубрики — образовательная, поэтому мы бесплатно публикуем качественные задачки, которые различные компании предлагают соискателям. Вы шлете задачки на lozovsky@glc.ru — мы их публикуем. Никаких актов, договоров, экспертиз и отчетностей. Читателям — задачки, решателям — подарки, вам — респект от нашей многосоттысячной аудитории, пиарщикам — строчки отчетности по публикациям в топовом компьютерном журнале.

    Задача 1

    При использовании очевидного представления данных для сохранения даты требуется 8 байт (ДДММГГГГ), а имя человека занимает примерно 25 байт (14 на фамилию, 10 на имя и 1 на первую букву отчества). Насколько вы сможете уменьшить эти числа, если перед вами стоит задача экономии памяти?

    Решение

    • Первый способ уменьшения числа байтов для хранения даты:
      • день месяца — это число от 1 до 31, для записи его в бинарном представлении достаточно 5 бит;
      • месяц — это число от 1 до 12 — 4 бита;
      • год — число от 0 до 9999 — 14 бит.
      • Получаем 23 бита на хранение даты, или 3 байта (23/8 = 2,875).
    • Второй способ уменьшения числа байтов для хранения даты: день можно отсчитывать от какого-то заранее заданного дня, и если предположить, что даты будут от 1 января 1 года до 31 декабря 9999 года, то это примерно 3 649 635 дней (365 * 9999), значение дня поместится в 22 бита.
    • Первый способ хранения имени
      • Если предположить, что имя будет записано только русскими (33 буквы) и английскими буквами (26), это 59 различных букв и для хранения одного символа нам достаточно 6 бит. На 25 символов нам нужно 6 * 25 = 150 бит, или 19 байт (150/8 = 18,75).
    • Второй способ хранения имени (улучшение первого)
      • Если фамилия может быть короче 14 символов, имя — короче 10, можно ввести символ окончания строки, например 0. Тогда если имя и фамилия короткие, то для хранения полного имени минимум может потребоваться 5 символов, это случай, когда фамилия, имя и отчество состоят из одного символа, и нам нужно сохранить одну букву фамилии, один символ окончания строки, одну букву имени, один символ окончания строки, одну букву отчества, то есть 5 * 6 = 30 бит, или 4 байта. Если фамилия и имя состоят из максимального числа символов, то разделитель не используем.

      Получаем, что для хранения имени потребуется от 30 до 150 бит, или от 4 до 19 байт.

      Задача 2

      Написать (на любом языке программирования) функцию вывода n-го числа последовательности Фибоначчи.

      Решение

      Приведем вариант на языке Java. Самый простой способ — это написать решение с использованием рекурсии:

      Однако вычислительная сложность этого способа оставляет желать лучшего, поэтому так лучше не делать. Реализация без рекурсии, с использованием цикла, будет работать намного быстрее, так как вычислительная сложность будет O(n):

      Это решение тоже имеет недостаток: с определенного момента (n = 92) будет переполнение разрядной сетки и метод вернет неверное значение. Для больших значений числа Фибоначчи можно использовать класс BigInteger, который предназначен для работы с большими числами. Получим следующий результат:

      Задача 3

      В массиве натуральных чисел [1..1001], содержащем все числа от 1 до 1000 включительно, есть элемент, повторяющийся дважды. Найти его. К каждому элементу можно обращаться только один раз. Язык программирования — любой.

      Решение

      Решение будет представлено на языке Java. Чтобы найти повторяющийся элемент, нужно сложить все числа из массива и вычесть из получившегося числа сумму чисел от 1 до 1000.

      Задача 4

      Заданы два числа a, b. Поменять их значения местами без использования промежуточной переменной (то есть использовать можно только a, b и арифметические операции).

      Решение

      Задача 5

      Что такое полиморфизм? Приведите примеры.

      Решение

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

      Рассмотрим такой пример полиморфизма на Java.

      В этом примере в метод searchOn мы передаем объекты двух разных типов, и внутри searchOn объекты разных типов обработались единообразно и выполнили разные действия. Это был пример динамического полиморфизма — какой метод будет вызван, определяется во время выполнения программы.

      Рассмотрим еще пример полиморфизма.

      Тут в функцию Math.abs мы передаем объекты разных типов (int и double), но при этом разные типы обрабатываются единообразно, и в результате получаем абсолютное значение числа. Это пример статического полиморфизма — какой метод будет вызван, определяется на этапе компиляции.

      Задача 6

      Четыре человека должны перейти через пропасть по мосту. Одновременно на мосту могут находиться не больше двух человек, держась за руки, и только с фонарем. Одному из пары надо возвращаться, чтобы вернуть фонарик. Один из них переходит мост за одну минуту, второй за две, третий за пять, четвертый за девять минут. Необходимо всем перебраться через мост за 17 мин.

      Перекидывать фонарик, идти навстречу, переплывать, останавливаться — нельзя. Задача решаема.

      Решение

      • Обозначим людей, которые переходят мост за 1, 2, 5 и 10 мин, как 1, 2, 5, 10 соответственно.
      • Сначала переходят два человека 1 и 2, 1 возвращается назад.
      • Теперь переходят 5 и 10, возвращается назад 2.
      • Переходят 2 и 1.
      • Получаем суммарное время на переход моста 2 + 1 + 10 + 2 + 2 = 17 минут.

      Задача 7

      Дана реляционная база данных, которая состоит из трех таблиц.

      Три таблицы реляционной базы данных

      Написать на SQL программу, которая выведет все компании, где не работает Developer c >

      Вопросы на собеседованиях по C# и .Net. На позицию junior/middle. Часть 1.

      Совсем скоро настанет момент, когда нужно будет устраиваться на другую работу, а, соответственно, начнутся и собеседования. Для того чтобы не облажаться получить должность, желательно подготовиться. Поэтому появилась идея создать серию статей, в которых будут собраны различные вопросы, которые могут Вам попасться, и дать на них ответы. Материалы брались из различных источников, список будет в конце. Предлагайте в комментариях свои варианты вопросов, они так же будут добавлены в общий список. Итак, начнем!

      Вопрос 1.

      Есть следующее объявление классов A и B:

      Что выведут на консоль такие вызовы метода Foo():

      Ответ:

      Во-первых ошибка в том, что не указаны модификаторы доступа в определениях метода Foo в классах A и B.

      Нельзя использовать модификатор virtual с Модификаторами static , abstract , private , или override . (ссылка на источник: https://docs.microsoft.com/ru-ru/dotnet/csharp/language-reference/keywords/virtual )

      А по умолчанию при определении метода ему присваивается модификатор private.

      Во-вторых когда создается переменная obj1 типа B и в нее помещается объект типа A

      производится неявный downcast, что недопустимо.

      Правильный код бы выглядел вот так

      Тогда результатом будет:

      Вопрос 2.

      Есть следующая структура:

      Что будет выведено в следующем случае:

      1. true, true
      2. true, false
      3. false, true
      4. false, false

      Ответ:

      Правильный ответ под номером 4 (false, false). Это происходит потому, что блок

      на самом деле выполняется как

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

      На эту тему есть статья. (скорее всего сделаю перевод этой статьи и опубликую здесь, уж очень она познавательна)

      Вопрос 3.

      Есть следующий код:

      Что будет выведено на консоль? Варианты ответов:

      1. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
      2. 10, 10, 10, 10, 10, 10, 10, 10, 10, 10
      3. Код сгенерирует исключение
      4. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

      Ответ:

      Правильный ответ 2 (выведет 10 раз число 10).

      Это происходит потому, что в цикле for в переменную actions будет записано 10 действий WriteLine(count). После 10 итерации цикла for переменная count примет значение 10. А когда мы будем пробегаться по циклу foreach, мы будем вызывать подряд 10 методов Console.WriteLine(count) из списка actions, где count = 10.

      Вопрос 4.

      Что будет выведено на консоль в результате следующих операций:

      Ответ:

      Произойдет ошибка на этапе выполнения в последней строке. При упаковке в переменной типа int в переменную типа object распаковка может происходить только в этот же тип, а уже после этого можно производить другие приведения. (ссылка на пояснение на msdn)

      Вопрос 5.

      Что выведет на консоль следующий код:

      1. true, false, true, true
      2. true, true, true, true
      3. true, false, true, false
      4. true, false, false, false

      Ответ:

      Ухххх. а с этим вопросом можно сломать мозг, здесь затрагивается тема интернирования строк. Ответом будет номер 1 (true false true true). Это происходит потому, что в C# есть пул интернирования в котором хранятся ссылки на строки, подробнее эта тема будет рассмотрена отдельно.

      А вкратце можно ответить так. При запуске программы среда CLR находит все строковые литералы и добавляет их в пул интернирования до ее выполнения. При создании новых переменных с этими значениями в них помещается только ссылка из пула. Операция конкатенации воспринемается средой CLR в качестве целого строкового литерала (это будет наглядно если посмотреть код в программе ildasm), а вот операция String.Format создаёт строку уже в момент выполнения программы и переменная получит другую ссылку, хотя по значению они будут равны. Поэтому при сравнении ссылок на s1 и s2 программа нам выдает false, а в этот же момент s2 и s3 true.

      В этой статье были рассмотрены только пять вопросов, но дальше-больше, ждите обновлений, а также пишите в комментариях варианты своих вопросов и.

      Задачи по программированию. Где размять руки?

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

      В обучении программированию действует тот же принцип. Конечно, на GeekBrains вы получите практические задания и помощь преподавателей. Однако и после завершения курсов вы наверняка захотите размять руки, а также повысить свой уровень путем решения всевозможных задач. Чтобы помочь вам в этом, мы отобрали несколько ресурсов с упражнениями.

      В первую очередь отметим, что знание английского языка, как и во многих иных жизненных ситуациях, существенно облегчит жизнь в повышении навыков программирования. Ведь большинство порталов, на которых размещены практические задания, англоязычные. Как, к примеру, W3resource.

      Целевая аудитория сайта – начинающие web-разработчики. Именно им предназначено солидное количество задач по HTML, PHP, Python, JavaScript, на решение которых можно потратить не один день и даже неделю. Ни регистрации, ни дополнительного инструментария портал не требует: удобство пользования обеспечивает встроенный редактор, а также ссылки на правильные ответы, если решение задачи все же поставило вас в тупик.

      Coding Bat

      Схожей стратегии придерживается и Coding Bat. Создатели ресурса также предпочли узкую направленность, сконцентрировавшись на упражнениях по Java и Python. Малое разнообразие упражнений с лихвой компенсирует количество и качество задач, а также удобство пользования. Разумеется, опять же, встроенный редактор и ответы. Кроме того, портал подойдет как для начинающих, так и опытных разработчиков.

      Code Abbey

      Успех любого обучения кроется в правильной мотивации, которая, без сомнения, присутствует в Code Abbey. Так, любой пользователь, решивший 125 задач, может получить соответствующий сертификат. Разумеется, бесплатно. Еще один плюс ресурса – возможность выполнения заданий на практически любом распространенном языке (от C до Julia).

      Top Coder

      Впрочем, даже такая мотивация не столь действенна, как денежное вознаграждение. Так на Top Coder вы сможете не только повысить свой уровень, но и подзаработать: по факту ресурс представляет из себя список соревнований, победитель которых получит пусть и не поражающую воображение, но приятную награду. Наиболее же успешные участники вдобавок имеют шансы «засветиться». Мастодонты индустрии вроде Microsoft, Facebook или IBM периодически мониторят портал в поисках новых талантов.

      Programmr

      На данном портале в свое время также можно было участвовать в соревнованиях. Однако к текущему моменту все они потеряли актуальность. Тем не менее, ресурс по-прежнему являет собой богатую площадку для развития навыков. В первую очередь – за счет многочисленных задач по Java, C++, PHP, C#, Ruby, Python и Objective-C. В каждой из них нужно дописать большую часть кода. Как правило, на выполнение задания отводится 30 минут.

      Кроме того, на данном ресурсе вы можете создать свой проект и поделиться им с миром – количество просмотров некоторых из таковых переваливает за 100 000.

      Programming Skills

      Тем же, кто устал от написания кодов и хочет привнести большего разнообразия в учебный процесс, подойдет портал Programming Skills. На нем можно найти серии тестов из 20 вопросов по C, HTML, C#, Java и другим языкам. На выполнение каждого дается 25 минут. Помимо них, на ресурсе содержится богатый перечень вопросов, с которыми вам, возможно, доведется столкнуться на собеседовании.

      SQL-EX.RU

      Наконец, для изучающих SQL идеально подойдет данный портал. Он предлагает огромное количество задач, охватывающих все типажи запросов. Для мотивации же пользователей введена рейтинговая система всех зарегистрировавшихся посетителей – за каждый верный ответ вы получите определенное число очков. Количество оных зависит от сложности задачи, в чем, к слову, кроется и еще один плюс ресурса. Ведь он подойдет как начинающим (или тем, кому достаточно базовых знаний), так и тем, чья служба невозможна без конструирования сложных запросов.

      Единственный, но временами досаждающий минус – отсутствие альтернативных путей. Иными словами: правильность выполнения упражнения определяется не ответом, а методом решения. В результате порой возникают парадоксы, в которых фактически правильный ответ не засчитывается как верный.
      Автор: Александр Мороз

      Тем, кто только начинает свой путь в кодинге, рекомендуем бесплатный курс по Основам программирования.

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

      В обучении программированию действует тот же принцип. Конечно, на GeekBrains вы получите практические задания и помощь преподавателей. Однако и после завершения курсов вы наверняка захотите размять руки, а также повысить свой уровень путем решения всевозможных задач. Чтобы помочь вам в этом, мы отобрали несколько ресурсов с упражнениями.

      В первую очередь отметим, что знание английского языка, как и во многих иных жизненных ситуациях, существенно облегчит жизнь в повышении навыков программирования. Ведь большинство порталов, на которых размещены практические задания, англоязычные. Как, к примеру, W3resource.

      Целевая аудитория сайта – начинающие web-разработчики. Именно им предназначено солидное количество задач по HTML, PHP, Python, JavaScript, на решение которых можно потратить не один день и даже неделю. Ни регистрации, ни дополнительного инструментария портал не требует: удобство пользования обеспечивает встроенный редактор, а также ссылки на правильные ответы, если решение задачи все же поставило вас в тупик.

      Coding Bat

      Схожей стратегии придерживается и Coding Bat. Создатели ресурса также предпочли узкую направленность, сконцентрировавшись на упражнениях по Java и Python. Малое разнообразие упражнений с лихвой компенсирует количество и качество задач, а также удобство пользования. Разумеется, опять же, встроенный редактор и ответы. Кроме того, портал подойдет как для начинающих, так и опытных разработчиков.

      Code Abbey

      Успех любого обучения кроется в правильной мотивации, которая, без сомнения, присутствует в Code Abbey. Так, любой пользователь, решивший 125 задач, может получить соответствующий сертификат. Разумеется, бесплатно. Еще один плюс ресурса – возможность выполнения заданий на практически любом распространенном языке (от C до Julia).

      Top Coder

      Впрочем, даже такая мотивация не столь действенна, как денежное вознаграждение. Так на Top Coder вы сможете не только повысить свой уровень, но и подзаработать: по факту ресурс представляет из себя список соревнований, победитель которых получит пусть и не поражающую воображение, но приятную награду. Наиболее же успешные участники вдобавок имеют шансы «засветиться». Мастодонты индустрии вроде Microsoft, Facebook или IBM периодически мониторят портал в поисках новых талантов.

      Programmr

      На данном портале в свое время также можно было участвовать в соревнованиях. Однако к текущему моменту все они потеряли актуальность. Тем не менее, ресурс по-прежнему являет собой богатую площадку для развития навыков. В первую очередь – за счет многочисленных задач по Java, C++, PHP, C#, Ruby, Python и Objective-C. В каждой из них нужно дописать большую часть кода. Как правило, на выполнение задания отводится 30 минут.

      Кроме того, на данном ресурсе вы можете создать свой проект и поделиться им с миром – количество просмотров некоторых из таковых переваливает за 100 000.

      Programming Skills

      Тем же, кто устал от написания кодов и хочет привнести большего разнообразия в учебный процесс, подойдет портал Programming Skills. На нем можно найти серии тестов из 20 вопросов по C, HTML, C#, Java и другим языкам. На выполнение каждого дается 25 минут. Помимо них, на ресурсе содержится богатый перечень вопросов, с которыми вам, возможно, доведется столкнуться на собеседовании.

      SQL-EX.RU

      Наконец, для изучающих SQL идеально подойдет данный портал. Он предлагает огромное количество задач, охватывающих все типажи запросов. Для мотивации же пользователей введена рейтинговая система всех зарегистрировавшихся посетителей – за каждый верный ответ вы получите определенное число очков. Количество оных зависит от сложности задачи, в чем, к слову, кроется и еще один плюс ресурса. Ведь он подойдет как начинающим (или тем, кому достаточно базовых знаний), так и тем, чья служба невозможна без конструирования сложных запросов.

      Единственный, но временами досаждающий минус – отсутствие альтернативных путей. Иными словами: правильность выполнения упражнения определяется не ответом, а методом решения. В результате порой возникают парадоксы, в которых фактически правильный ответ не засчитывается как верный.
      Автор: Александр Мороз

      Тем, кто только начинает свой путь в кодинге, рекомендуем бесплатный курс по Основам программирования.

      Задачи для самостоятельного решения по основам языка C#

      Предполагается, что изучив раздел «Основы языка С#» и разобрав изложенные выше примеры, вы сможете решить следующие задачи:

      1. Решение квадратного уравнения ax 2 +bx+c=0. Ввести a,b,c и найти корни квадратного уравнения. Если дискриминант меньше нуля, вывести сообщение, что действительных корней нет.
      2. Вычисление площади треугольника по формуле Герона. Даны стороны треугольника a,b,c. Найти площадь S.
      3. Найти произведение всех целых нечетных чисел, принадлежащих интервалу [n_min, n_max]. Реализуйте вычисления тремя методами, в каждом из которых будет использован один из операторов цикла (for, while, do-while).
      4. Найти произведение всех целых четных чисел, делящихся на 4 и принадлежащих интервалу [n_min, n_max].
      5. Найти сумму ряда RN=1+2+4+…+2 N . Вычисление реализуйте через цикл и выведенной вами формуле (подсказка – это геометрическая прогрессия), сравните результаты.
      6. Найти сумму ряда SN=1+1/2+1/4+…+1/2 N . Чему будет равна сумма при достаточно больших N? Вычисление реализуйте через цикл и по выведенной вами формуле (подсказка – это тоже геометрическая прогрессия), сравните результаты.
      7. Вычислить значение тригонометрической функции cos(x) от произвольного значения аргумента x, используя разложение в ряд. Сравните с результатом, предоставляемым методом Math.Cos(x) из библиотеки System.
      8. Вычислить значение тригонометрической функции tg(x) от произвольного значения аргумента x, используя разложение в ряд. Сравните с результатом, предоставляемым методом Math.Tan(x) из библиотеки System.
      9. Заданы две функции: y1(a)=a 2 (a 2 +12)-5 и y2(a)=a(a 2 +1). Определите, при каких значениях параметра a наибольший общий делитель – НОД(y1(a), y2(a)) будет больше 1. Параметр a – целое число от 1 до 100.
      10. Записать разложение бинома Ньютона (x+a) n по степеням x.
      11. Напишите программу «Конвертор валют» с использованием конструкции switch-case.
      12. Запишите представление произвольного целого положительного десятичного числа в двоичной, восьмеричной и шестнадцатеричной системах счисления, например: 259(10)=100000011(2)=403(8)=103(16).
      13. Запишите произвольное целое положительное число, представленное в шестнадцатеричной системе счисления, в форме десятичного числа, например: A2F(16)=2607(10).
      14. Вычислите N-й член (FN) ряда Фибоначчи: 1, 1, 2, 3, 5, 8, 13, 21, … Известно, что отношение FN/ FN-1 при достаточно больших N стремится к золотому сечению ф, где ф — положительный корень квадратного уравнения: ф 2 -ф-1=0. Определите программным путем, начиная с какого N | FN/ FN-1 — ф | -10.

      Список задач предполагается дальше продолжить. Присылайте интересные задачи.

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

      Expert Coders

      Что будет выведено после запуска следующей программы и почему:

      Что бы вы ответили на данный вопрос?

      Читайте также:

      23 thoughts on “ Вопрос по C# на собеседовании ”

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

      В данном примере возможность virtual потенциально описана, но в коде Main не использована.

      Код “var a = new Derived();” для переменной “а” в памяти отводит место как для Derived, значит a.Foo() вызовет собственный метод класса Derived
      и вернет: “Derived::Foo(object o)”

      Сноска:
      * для виртуального метода вызывается метод, соответствующий типу объекта, на который имеется ссылка;
      * для невиртуального метода вызывается метод, соответствующий типу самой ссылки.

      Если под переменную в памяти отвести место как под Base, но загрузить в неё объект Derived,
      то смысл модификатора virtual будет реализован и вызовется перекрытый метод.

      Например:
      Base b = new Derived();
      b.Foo(x);
      вернет “Derived::Foo(int x)”

      Никак не могу понять. При поиске перегруженого метода приоритет имеют неперекрытые методы? Объясните подробней пожалуйста.

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

      Виртуальный метод перекрыт. А в итоге вызывается метод, который не перекрыт, а является новым в наследнике.

      Программа выводит: “Derived::Foo(object o)”

      Помоему вы путаете перекрытие и переопределение.

      хотя в разных книгах статьях по разному, скрытие перекрытие но override покрайнемере всюду на msdn – переопределение

      В классе Derived есть два метода (перегруженных, overload)
      В метод передаётся int, следовательно резолвер перегруженых методов должен выбрать наиболее подходящий Foo(int x)
      Но он выбирает метод с object. Видимо потому что метод с int является перекрытым (override). Если вместо override написать new, то будет вызываться метод c int.
      Вопрос, почему так и логично ли это?

      Совершенно логично кстати очень хорошая задача на знание особеннойстей полиморфизма с#
      Я плохо излагаю мысли но постораюсь объяснить, в этих двух классах вообще нет перегрузок. Определенный в родителе метод является виртуальным(virtual) следовательно его реализация зависит от объекта на который он ссылается переменная. В классе предке виртуальный метод переопределен(override), но также в этом классе есть метод с таким же названием и другой сигнатурой он не перегружает метод Foo т.к. не иммеет ключевого слова override а скрывает его для переменных типа Derived и вызыватся будет в данном случае он, неявное преобразование к типу обжект возможно для любого типа, а вот если бы создавалась переменная типа Base и ей присваивался объект типа Derived то вызывался бы метод переопределенный предком а не скрытый.

      Спасибо большое за объяснения. Но я к сожалению так и не пойму почему при вызове метода Derived::Foo, Выбирается метод с object, а не с int. Не могу понять при чем тут класс Base и то что метод помечен как override? У класса Derived есть два метода с одим именем и разными параметрами, разве это не перегрузка? Почему нет? (Разве это важно что один из методов был переопределен у родителя? Это как-то отключает перегрузку? (overload))
      Где можно почитать про такое поведение? Страница спецификации может быть?

      Узнал причину на одном из форумов:

      1. Overrides are not included in the set of candidate methods during
      resolution. This may seem counterintuitive since an override is more specific
      and therefore a better match. However, an override is logically the same
      method as the original declared in the base class. The original is still a
      candidate after we remove the overrides. If the remaining steps in the
      resolution process select the original method (i.e. the virtual version),
      dynamic binding will ensure that the correct override version executes.

      2. All candidate methods must come from the same type. We use the lowest
      type in the hierarchy that contains an applicable method. We would prefer to
      select a method from the lowest type since it is the most specific and we
      assume it would perform the most appropriate operation. Only if the lowest
      type does not contain an applicable method do we look further up the
      hierarchy. We keep all the methods declared in that type and discard all
      methods declared in all other types. We discard methods in the other types
      even if their parameter list is a better match.

      вот перегрузка метода переопределяющего виртуальный метод родителя к примеру
      public virtual void Foo(int x)<….>
      public virtual void Foo(double x)<….>
      а вот перегрузка метода скрывающего метод который переопределяет виртуальный метод родителя )))
      public void Foo(object o)<….>
      public void Foo(byte o)<….>
      в том примере перегрузок нет
      и кстати говоря по хорошему в скрывающем методе надо писать new если не писать компилятор выдает предупреждение и сам это делает. не знаю где лучше почитать MSDN,RSDN ) полиморфизм наследование виртуальные методы … кстати что за контора если не секрет

      Ой там не virtual а override)

      Я прекрасно разбираюсь в сокрытии, в перегрузке и переопределении. Я только понятия не имел, что из кандидатов к резолву перегрузки выкидываются overrideнутые методы.
      Ваше описание я к сожалению так и не понял.

      Они не выкидываются, здесь даже намека нет на перегрузку это методы разных классов о – “an override is logically the same method as the original declared in the base class.”

      Например мой класс использует кто-то другой. И я вдруг решил один из методов перенести в базовый класс. Это поламает сторонний код, который использует мой класс. Вывод: надо везде использовать интерфейсы. Но это всё очень не очевидно для меня.

      не понял) зачем что то переносить методы наследуются а реализация виртуального метода зависит от типа объекта, грубо говоря можно в родительском классе использовать методы которые будут определены в дочерних

      Решил перенести метод из наследника в базовый класс. Рефакторинг такой. Решил что так лучше будет, так как кто-то ещё может этот метод использовать. А в наследнике сделал override.
      Получается я этим действием ломаю работающую схему механизма резолва перегрузки.
      Там где заказчик вызывал мой метод Foo, он получал int, а теперь только из-за того, что я внутри своей реализации сместил метод с int в базовый класс и переопределил его в наследнике у заказчика станет вызываться метод object. Заказчик рад не будет, и не будет понимать почему это произошло, ведь как было два метода в Derived так и осталось.

      Зачем в таком случае вообще объявлять метод виртуальным и писать override в наследнике? Два метода но один помечен override а другой нет, если вам нужно просто задать свою реализацию для данного потомка можно скрыть метод.Этот пример явная бессмыслица и призван запутать, в жизни такое писать врятли будет необходимость.

      У меня есть метод в базовом классе, базовый класс я менять не могу. Мне надо в дочернем классе создать перегрузку для этого метода. Как вы посоветуете действовать?
      Пока что я выкручиваюсь тем, что создаю интерфейс для дочернего класа, в котором есть оба метода, и вызываю методы через интерфейс, тогда резолвится всё так как и предполагается.
      Но если кто-то вызовет мой класс не через интерфейс, то будет резолвиться по другому.

    Добавить комментарий