❓ 15 самых часто задаваемых вопросов на собеседовании про .NET

В этой статье подобраны 15 самых часто задаваемых вопросов на собеседовании про .NET. Подборка будет полезна как начинающим .NET-разработчикам, так и профессионалам, чтобы освежить память.
❓ 15 самых часто задаваемых вопросов на собеседовании про .NET

1. Что такое наследование и почему оно важно в разработке?

Наследование – одна из важнейших концепций объектно-ориентированного программирования, наряду с инкапсуляцией и полиморфизмом. Наследование позволяет разработчикам создавать новые классы, которые повторно используют, расширяют и изменяют поведение, определенное в других классах. Это позволяет повторно использовать код и ускоряет разработку. Благодаря наследованию, разработчики могут написать и отладить один класс только один раз, а затем повторно использовать этот же код в качестве основы для новых классов. Класс, от которого наследуются, называется базовым классом, а класс, который наследует, называется производным классом. По умолчанию все классы в .NET являются наследуемыми.

2. Разница между классом и объектом

Класс – это определение объекта, а объект – это экземпляр класса.

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

3. Разница между управляемым и неуправляемым кодом

Управляемый код – это код, созданный компилятором .NET. Он не зависит от архитектуры целевой машины, поскольку выполняется CLR (Common Language Runtime), а не самой операционной системой. CLR и управляемый код предлагают разработчикам несколько преимуществ, таких как сборка мусора, проверка типов и обработка исключений.

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

В .NET компилятор Visual Basic и C# создает управляемый код. Чтобы получить неуправляемый код, приложение должно быть написано на C или C++.

Больше полезных материалов вы найдете на нашем телеграм-канале «Библиотека шарписта»

4. Разница между циклами while и for. Приведите синтаксис .NET для обоих циклов

Оба цикла используются, когда нужно многократно выполнить единицу кода. Разница в том, что цикл for используется, когда вы знаете, сколько раз вам нужно выполнить итерацию кода. С другой стороны, цикл while используется, когда вам нужно повторять что-то до тех пор, пока заданное утверждение не станет истинным.

Синтаксис цикла while:

        while (условие [is true])
{

}

    

Синтаксис цикла for :

        for (инициализация; условие; итерация)
{
  
}
    

5. Разница между boxing и unboxing. Приведите пример.

Boxing – это процесс преобразования типа значения в тип объекта, а unboxing – извлечение типа значения из объекта. Boxing является неявным, unboxing – явным.

Пример:

        int i = 13;
object myObject = i; 	// boxing 
i = (int)myObject;	// 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, а не в объектный код, специфичный для платформы или процессора.

Подведем итоги:

  1. При компиляции исходный код сначала транслируется в IL (в .NET это CIL, а ранее назывался MSIL).
  2. Затем CIL собирается в байткод и создается сборка CLI.
  3. Перед выполнением кода CLI-код проходит через JIT-компилятор среды выполнения для генерации родного машинного кода.
  4. Процессор компьютера выполняет родной машинный код.

9. Разница между stack и heap

В stack хранятся типы значений(типы, унаследованные от System.ValueType), а в heap – ссылочные типы (типы, унаследованные от System.Object).

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

10. Различия между интерфейсом и абстрактным классом в .NET

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

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

Интерфейс и абстрактный класс не могут быть инстанцированы.

11. Что такое отложенное выполнение и немедленное выполнение в LINQ. Приведите примеры

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

        DataContext productContext = new DataContext();

var productQuery = from product in productContext.Products
        where product.Type == "SOAPS"
        select product;   // запрос не выполняется

foreach (var product in productQuery)   // запрос выполняется здесь
{
  Console.WriteLine(product.Name);
}

    

Немедленное выполнение запроса полезно, например, если база данных часто обновляется, и в логике программы важно, чтобы результаты, к которым обращаются, были возвращены в той точке вашего кода, где был задан запрос. Немедленное выполнение часто вызывается с помощью таких методов, как Average, Sum, Count, List, ToList или ToArray. Например:

        DataContext productContext = new DataContext();

var productCountQuery = (from product in productContext.Products
        where product.Type == "SOAPS"
        select product).Count();   // запрос выполняется здесь
    

12. Что такое делегаты в .NET?

Делегат в .NET похож на указатель функции в C или C++. Использование делегата позволяет программисту заключить ссылку на метод внутри объекта делегата. Затем объект делегата может быть передан в код, который может вызвать метод, на который ссылается ссылка, необязательно знать во время компиляции, какой метод будет вызван. Кроме того, можно использовать делегат для создания пользовательских событий в классе. Например:

        public delegate void FooDelegate();

class FooClass
{
    // кастомное событие
    public event FooDelegate FooEvent;
}

FooClass FooObj = new FooClass()
FooObj.FooEvent += new FooDelegate();
    

13. Как реализовать generic action в WebAPI?

Это невозможно, поскольку среда выполнения WebAPI должна знать имя и параметры методов заранее.

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

Они всегда публичные, так как цель интерфейса – определение функционала для реализации его классом. Это касается также и констант и статических переменных, которые в классах и структурах по умолчанию имеют модификатор private. В интерфейсах же они имеют по умолчанию модификатор public.

15. Разница между constant и readonly

Constant и readonly имеют много общего, но есть некоторые важные различия:

  1. constant оценивается во время компиляции, в то время как readonly оценивается во время выполнения.
  2. constant поддерживает только переменные типа значения (единственным исключением являются строки), в то время как readonly может содержать переменные ссылочного типа.
  3. constant следует использовать, когда значение не меняется во время выполнения, а readonly используется в основном тогда, когда фактическое значение неизвестно до выполнения.
  4. readonly может инициализироваться только во время объявления или в конструкторе.
***

Материалы по теме

МЕРОПРИЯТИЯ

Комментарии

ВАКАНСИИ

Добавить вакансию
Продуктовый аналитик
Екатеринбург, по итогам собеседования
PHP Developer
от 200000 RUB до 270000 RUB
Аналитик данных
Екатеринбург, по итогам собеседования

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ