1. Что такое наследование и почему оно важно в разработке?
Наследование – одна из важнейших концепций объектно-ориентированного программирования, наряду с инкапсуляцией и полиморфизмом. Наследование позволяет разработчикам создавать новые классы, которые повторно используют, расширяют и изменяют поведение, определенное в других классах. Это позволяет повторно использовать код и ускоряет разработку. Благодаря наследованию, разработчики могут написать и отладить один класс только один раз, а затем повторно использовать этот же код в качестве основы для новых классов. Класс, от которого наследуются, называется базовым классом, а класс, который наследует, называется производным классом. По умолчанию все классы в .NET являются наследуемыми.
2. Разница между классом и объектом
Класс – это определение объекта, а объект – это экземпляр класса.
Можно рассматривать класс как шаблон объекта: он описывает все свойства, методы, состояния и поведение, которыми будет обладать реализующий объект. Как уже говорилось, объект – это экземпляр класса, а класс становится объектом только после инициирования. На основе одного класса может существовать несколько экземпляров объектов, каждый из которых обладает различными свойствами.
3. Разница между управляемым и неуправляемым кодом
Управляемый код – это код, созданный компилятором .NET. Он не зависит от архитектуры целевой машины, поскольку выполняется CLR (Common Language Runtime), а не самой операционной системой. CLR и управляемый код предлагают разработчикам несколько преимуществ, таких как сборка мусора, проверка типов и обработка исключений.
С другой стороны, неуправляемый код напрямую компилируется в родной машинный код и зависит от архитектуры целевой машины. Он выполняется непосредственно операционной системой. В неуправляемом коде разработчик должен убедиться, что он вручную решает вопросы использования и выделения памяти (особенно из-за утечек памяти), безопасности типов и исключений.
В .NET компилятор Visual Basic и C# создает управляемый код. Чтобы получить неуправляемый код, приложение должно быть написано на C или C++.
4. Разница между циклами while и for. Приведите синтаксис .NET для обоих циклов
Оба цикла используются, когда нужно многократно выполнить единицу кода. Разница в том, что цикл for
используется, когда вы знаете, сколько раз вам нужно выполнить итерацию кода. С другой стороны, цикл while
используется, когда вам нужно повторять что-то до тех пор, пока заданное утверждение не станет истинным.
Синтаксис цикла while:
Синтаксис цикла for :
5. Разница между boxing и unboxing. Приведите пример.
Boxing – это процесс преобразования типа значения в тип объекта, а unboxing – извлечение типа значения из объекта. Boxing является неявным, unboxing – явным.
Пример:
6. Что такое LINQ.
LINQ – это аббревиатура от Language Integrated Query, она была представлена в Visual Studio 2008. LINQ – это набор функций, расширяющих возможности запросов в синтаксисе языка .NET путем добавления наборов новых стандартных операторов запросов, которые позволяют манипулировать данными независимо от источника данных. Поддерживаемыми источниками данных являются: Коллекции .NET Framework, базы данных SQL Server, наборы данных ADO.NET, документы XML и любые коллекции объектов, поддерживающие IEnumerable или generic интерфейс IEnumerable<T>
, как в C#, так и в Visual Basic. Одним словом, LINQ преодолевает разрыв между миром объектов и миром данных.
7. Что такое сборщик мусора и как он работает. Приведите пример кода, показывающий, как можно обеспечить сборку мусора в .NET
Сборка мусора – это низкоприоритетный процесс, который служит в качестве автоматического менеджера памяти, управляющего распределением и освобождением памяти для приложений. Каждый раз, когда создается новый объект, среда выполнения общего языка выделяет память для этого объекта из управляемой кучи. Пока в управляемой куче есть свободное пространство памяти, среда выполнения продолжает выделять место для новых объектов. Однако память не бесконечна, и как только приложение заполняет пространство, в дело вступает сборщик мусора (Garbage Collector), который освобождает часть памяти. Когда сборщик мусора выполняет очистку, он проверяет объекты в управляемой куче, которые больше не используются приложением, и выполняет необходимые операции. Сборщик мусора останавливает все запущенные потоки, находит все объекты в куче, к которым не обращается основная программа, и удаляет их. Затем он собирает все объекты, оставшиеся в куче, чтобы освободить место, и корректирует все указатели на эти объекты в стеке и в куче.
Чтобы запустить сборку мусора в коде вручную, выполняем следующую команду:
System.GC.Collect();
8. Что означают следующие аббревиатуры в .NET: IL, CIL, MSIL, CLI и JIT?
IL (Intermediate Language) – это независимый от процессора частично скомпилированный код. Код IL будет скомпилирован в родной машинный код с использованием текущих свойств среды компилятором Just-In-Time (JIT). JIT-компилятор переводит IL-код в код сборки и использует архитектуру процессора целевой машины для выполнения приложения .NET. В .NET язык IL называется Common Intermediate Language (CIL), а на первых этапах .NET он назывался Microsoft Intermediate Language (MSIL).
CLI (Common Language Infrastructure) – это открытая спецификация, разработанная компанией Microsoft. Это библиотека скомпилированного кода, используемая для развертывания, создания версий и обеспечения безопасности. В .NET существует два типа CLI: сборки процессов (EXE) и сборки библиотек (DLL). Сборки CLI содержат код на языке CIL, и, как уже упоминалось, при компиляции языков программирования CLI исходный код транслируется в код CIL, а не в объектный код, специфичный для платформы или процессора.
Подведем итоги:
- При компиляции исходный код сначала транслируется в IL (в .NET это CIL, а ранее назывался MSIL).
- Затем CIL собирается в байткод и создается сборка CLI.
- Перед выполнением кода CLI-код проходит через JIT-компилятор среды выполнения для генерации родного машинного кода.
- Процессор компьютера выполняет родной машинный код.
9. Разница между stack и heap
В stack хранятся типы значений(типы, унаследованные от System.ValueType
), а в heap – ссылочные типы (типы, унаследованные от System.Object
).
Можно сказать, что stack отвечает за отслеживание того, что на самом деле выполняется и где находится каждый выполняющийся поток (каждый поток имеет свой собственный стек). Heap, с другой стороны, отвечает за хранение данных, или, более точно, объектов.
10. Различия между интерфейсом и абстрактным классом в .NET
Интерфейс просто объявляет поведение, которым должны обладать реализующие классы. Он объявляет только свойства, методы и события без модификаторов доступа. Все объявленные члены должны быть реализованы.
Абстрактный класс предоставляет частичную реализацию функциональности и некоторые абстрактные/виртуальные члены, которые должны быть реализованы сущностями, которые наследуют класс. Он также объявляет поля.
Интерфейс и абстрактный класс не могут быть инстанцированы.
11. Что такое отложенное выполнение и немедленное выполнение в LINQ. Приведите примеры
В LINQ отложенное выполнение означает, что запрос не выполняется в указанное время. В частности, это достигается путем присвоения запроса переменной. При этом определение запроса сохраняется в переменной, но запрос не выполняется до тех пор, пока переменная запроса не будет итерирована. Например:
Немедленное выполнение запроса полезно, например, если база данных часто обновляется, и в логике программы важно, чтобы результаты, к которым обращаются, были возвращены в той точке вашего кода, где был задан запрос. Немедленное выполнение часто вызывается с помощью таких методов, как Average
, Sum
, Count
, List
, ToList
или ToArray
. Например:
12. Что такое делегаты в .NET?
Делегат в .NET похож на указатель функции в C или C++. Использование делегата позволяет программисту заключить ссылку на метод внутри объекта делегата. Затем объект делегата может быть передан в код, который может вызвать метод, на который ссылается ссылка, необязательно знать во время компиляции, какой метод будет вызван. Кроме того, можно использовать делегат для создания пользовательских событий в классе. Например:
13. Как реализовать generic action в WebAPI?
Это невозможно, поскольку среда выполнения WebAPI должна знать имя и параметры методов заранее.
14. Почему нельзя указать модификаторы доступа для элементов в интерфейсе?
Они всегда публичные, так как цель интерфейса – определение функционала для реализации его классом. Это касается также и констант и статических переменных, которые в классах и структурах по умолчанию имеют модификатор private
. В интерфейсах же они имеют по умолчанию модификатор public
.
15. Разница между constant и readonly
Constant
и readonly
имеют много общего, но есть некоторые важные различия:
constant
оценивается во время компиляции, в то время какreadonly
оценивается во время выполнения.constant
поддерживает только переменные типа значения (единственным исключением являются строки), в то время какreadonly
может содержать переменные ссылочного типа.constant
следует использовать, когда значение не меняется во время выполнения, аreadonly
используется в основном тогда, когда фактическое значение неизвестно до выполнения.readonly
может инициализироваться только во время объявления или в конструкторе.
Комментарии