С#. Вопросы и ответы к собеседованию. Часть 4

Вопрос 15

В чем отличие необязательных параметров от именованных?

Ответ

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

Пример

Вопрос 16

Чем отличаются друг от друга классы String и StringBuilder? Зачем нужно такое разделение?

Ответ

String создает новые объекты при добавлении новой строки. StringBuilder работает с одним объектом в памяти.

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

StringBuilder же будет последовательно выделять память и “по-настоящему” дозаписываться данными. Так что при построении больших строк – только StringBuilder.

Вопрос 17

Какие отличие между значимыми и ссылочными типами?

Ответ

Типы по значению размещаются в стеке потока. Типы по ссылке размещаются в управляемой куче.

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

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

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

Более подробно на metanit

Вопрос 18

Как и зачем использовать конструкцию Using в C#?

Ответ

Это аналог try finally. Мы говорим компилятору, что ресурсы можно очистить. По окончании блока вызывается метод Dispose. Класс, который использует using обязательно должен реализовывать интерфейс IDisposalbe.

Вопрос 19

В чем отличие использования Finalize и Dispose?

В моменте очистки мусора.

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

Finalize определен для типа object и соответственно его потомков. Физическое удаление из памяти происходит в момент сборки мусора, например в конце программы. Dispose это метод интерфейса IDisposable. Предполагается, что физическое удаление ресурсов произойдет в момент вызова Dispose.

Вопрос 20

В чем основные отличия класса от структуры в языке C#?

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

Более подробно на metanit

Вопрос 21

Как можно сравнить строки в C#?

Через метод Compare например.

Либо по значению

Либо по ссылке

Вопрос 22

Что такое управляемый код и CLR? Основные требования к управляемому коду.

Ответ

CLR заботится об управлении памятью, о совместимости между платформами, о безопасности кода и так далее Это хорошо описано у Рихтера.

Вопрос 23

Разница IEnumerable<T> и IQueryable<T> при работе с удаленной БД ?

Ответ

IQueryable наследуется от IEnumerable

IEnumerable находится в пространстве имен System.Collections

IQueryable располагается в пространстве имен System.Linq

Объект IEnumerable представляет набор данных в памяти и может перемещаться по этим данным только вперед. Запрос, представленный объектом IEnumerable, выполняется немедленно и полностью, поэтому получение данных приложением происходит быстро.

Объект IQueryable предоставляет удаленный доступ к базе данных и позволяет перемещаться по данным как в прямом порядке от начала до конца, так и в обратном порядке

Методы расширений LINQ могут возвращать два объекта: IEnumerable и IQueryable. С одной стороны, интерфейс IQueryable наследуется от IEnumerable, поэтому по идее объект IQueryable это и есть также объект IEnumerable. Но реальность несколько сложнее. Между объектами этих интерфейсов есть разница в плане функциональности, поэтому они не взаимозаменяемы.

Интерфейс IEnumerable находится в пространстве имен System.Collections. Объект IEnumerable представляет набор данных в памяти и может перемещаться по этим данным только вперед. Запрос, представленный объектом IEnumerable, выполняется немедленно и полностью, поэтому получение данных приложением происходит быстро.

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

Интерфейс IQueryable располагается в пространстве имен System.Linq. Объект IQueryable предоставляет удаленный доступ к базе данных и позволяет перемещаться по данным как в прямом порядке от начала до конца, так и в обратном порядке. В процессе создания запроса, возвращаемым объектом которого является IQueryable, происходит оптимизация запроса. В итоге в процессе его выполнения тратится меньше памяти, меньше пропускной способности сети, но в то же время он может обрабатываться чуть медленнее, чем запрос, возвращающий объект IEnumerable.

Подробнее на metanit

Вопрос 24

Что такое абстракция и как она связана с ООП?

Ответ

Абстракция – это определенный уровень описания/представления модели чего либо.
ООП базируется на взаимодействии объектов которые описывают модель чего либо.
С помощью ООП можно создать абстракцию чего либо.
Абстракция необходима в крупных проектах.
С помощью нее можно обсуждать и работать на разных уровнях представления системы гораздо эффективнее не вдаваясь в детали всей системы.
Это как книга: название говорит о чем книга в целом, название разделов дает больше информации, но мы все равно не знаем что конкретно там написанно. Нахвание глав дает конкретнее посказку, но сама информация полная только внутри.
Представьте обсуждения книг без их названия, частей, глав.

 

Вопрос 25

Что такое IoC(Inversion of Control/инверсия зависимостей) и для чего она нужна?

stack

Ответ

Вопрос 26

Что такое DI(Dependency Injection) контейнер?

Ответ

Вопрос 27

Какие реализации DI контейнеров вы знаете на C#. Какой DI контейнер является лучшим?

Ответ

Вопрос 28

Что подразумевается под свойствами в C#?

На примере класса Person

или с логикой

 

Вопрос 29

Что такое assembly manifest (манифест сборки)?

Ответ

Описывает элементы сборки взаимодействующие друг с другом.

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

Вопрос 30

Что такое GAC? Возможно ли поместить два файла с одинаковым именем в Global Assembly Cache?

Ответ

Global Assebly Cache

Да, возможно, поскольку GAC не является обычной директорией, в которую невозможно поместить два файла с одинаковыми именами. Файлы дифференцируются также по версии, поэтому в GAC вполне могут сосуществовать к примеру два файла somelib.dll версии 1.0.0.0 и somelib.dll версии 1.1.0.0.

Вопрос 31

Какие модификаторы доступа существуют в C#?

private

public

internal – для данной сборки

protected – для класса и его потомков

sealed

Вопрос 32

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

Ответ

Упаковка

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

Распаковка

Распаковка является явным преобразованием из типа object в тип значения или из типа интерфейса в тип значения, реализующего этот интерфейс. Операция распаковки состоит из следующих действий:

  • проверка экземпляра объекта на то, что он является упакованным значением заданного типа значения;
  • копирование значения из экземпляра в переменную типа значения.

Вопрос 33

В чем суть полиморфизма?

Ответ

Полиморфизм это возможность изменения поведения объекта в его потомках через virtual / override или new.

Вопрос 34

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

Ответ

Поддерживающие IEnumerable

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

Вопрос 35

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

Главное отличие event от delegate состоит в том, что event может быть запущен только в классе, в котором объявлен. Помимо этого, при наличии event компилятор создает не только соответствующее приватное поле-делегат, но еще и два открытых метода для подписки и ее отмены на события (add / remove).

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

Вопрос 36

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

Через явное применение интерфейса

Вопрос 37

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

Подробнее на stack

Вопрос 38

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

Ответ

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

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

Вопрос 39

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

Ответ

Интерфейс — это абстрактный класс, у которого ни один метод не реализован, все они публичные и нет переменных класса.

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

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

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

Можно считать, что любой интерфейс — это уже абстрактный класс, но не наоборот.

Вопрос 40

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

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

Вопрос 41

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

Метод может быть переопределен в классе наследнике.

This entry was posted in C#. Bookmark the permalink.

Leave a Reply