如何通过C#面试:热门问题与答案

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Как пройти собеседование по C#: топ вопросов и ответы



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



1. В чем разница между value types и reference types?



Это базовый, но важный вопрос. В C# все типы делятся на две категории:



  • Value types (типы значений) — хранятся в стеке, копируются при присваивании. Примеры: int, double, struct, enum.
  • Reference types (ссылочные типы) — хранятся в куче (heap), переменная хранит ссылку на объект. Примеры: class, string, array, delegate.


Пример для собеседования:



int a = 10;int b = a;b = 20;Console.WriteLine(a); // 10 — значение не изменилось

var obj1 = new MyClass { Value = 10 };var obj2 = obj1;obj2.Value = 20;Console.WriteLine(obj1.Value); // 20 — ссылка та же


На собеседовании также часто спрашивают про boxing/unboxing — преобразование value type в object и обратно. Старайтесь избегать этого в коде, так как это снижает производительность.



2. Что такое делегаты, события и лямбда-выражения?



Делегаты — это типы, которые хранят ссылки на методы. События — это обертка над делегатами, используемая для реализации паттерна "издатель-подписчик".



Пример делегата:



public delegate void MyDelegate(string message);

public static void ShowMessage(string msg) => Console.WriteLine(msg);

MyDelegate del = ShowMessage;del("Hello from delegate");


Пример события:



public class Button{    public event EventHandler Click;    public void Press() => Click?.Invoke(this, EventArgs.Empty);}


Лямбда-выражения — это короткая запись анонимных методов. Они активно используются в LINQ:



var numbers = new List<int> { 1, 2, 3, 4, 5 };var even = numbers.Where(x => x % 2 == 0).ToList();


На собеседовании могут спросить: "Почему лучше использовать события, а не делегаты?" — ответ: события защищают список подписчиков от внешнего изменения (нельзя вызвать Invoke извне).



3. Как работает async/await и в чем отличие от многопоточности?



Это один из самых популярных вопросов. async/await — это синтаксический сахар для работы с асинхронными операциями. Он не создает новый поток, а эффективно использует существующий (поток UI или поток из пула).



Ключевые моменты:

  • async — модификатор метода, разрешающий использование await.
  • await — приостанавливает выполнение метода до завершения задачи, не блокируя поток.
  • Возвращаемый тип — обычно Task или Task<T>.


Пример:



public async Task<string> GetDataAsync(){    using var client = new HttpClient();    string result = await client.GetStringAsync("https://api.example.com");    return result;}


Отличие от многопоточности: многопоточность (Thread, Task.Run) — это параллельное выполнение кода на нескольких ядрах CPU. Async/await — это асинхронность, которая освобождает поток для других задач во время ожидания (например, ответа от сервера).



Совет: на собеседовании приводите реальный пример — загрузка данных из сети или файла. Избегайте async void (кроме обработчиков событий) — это может привести к необработанным и

博客

书籍推荐