100 вопросов с собеседований для C# разработчиков

Привет, коллеги! Сегодня хочу поделиться списком интересных и нестандартных вопросов, которые могут встретиться на собеседованиях для C# разработчиков. Они помогут не только проверить технические знания кандидата, но и продемонстрировать его подход к решению задач, умение мыслить креативно и адекватно оценивать ситуацию.

Некоторые вопросы могут быть сложными, другие — на грани абсурда, но все они направлены на то, чтобы понять, как кандидат работает с проблемами, даже если они не всегда связаны с привычными аспектами C#. Давайте разберём такие вопросы.

t.me/csharp_ci – Мой тг канал, где разобрано 1900 вопросов с собеседований C# и разобрана вся база


1. Что происходит при вызове метода Dispose в .NET?

  • Этот вопрос поможет понять, как кандидат работает с управлением ресурсами. Ожидается понимание работы с IDisposable и паттерном «dispose», который часто используется для освобождения неуправляемых ресурсов.

2. Какое поведение будет у async метода, если он не содержит await?

  • Вопрос направлен на проверку глубокого понимания асинхронного программирования в C#.

3. Какая разница между String и StringBuilder, и когда следует использовать один вместо другого?

  • Ответ поможет понять, знает ли кандидат о проблемах с производительностью при частых изменениях строк в .NET.

4. Каковы основные различия между интерфейсом и абстрактным классом в C#?

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

5. Можно ли изменить значение параметра, передаваемого в метод по значению?

  • Проверка на знания о параметрах и поведении значений в C#.

6. Что будет, если я попробую использовать async void в качестве обработчика события?

  • Вопрос на понимание работы с асинхронностью и потенциальные проблемы при использовании async void.

7. Как работает сборка мусора в .NET?

  • Вопрос на проверку знаний о процессе управления памятью в .NET, включая генерируемые поколения и работу с неуправляемыми ресурсами.

8. Что такое boxing и unboxing, и как это влияет на производительность?

  • Ожидается понимание работы с типами значений и ссылочными типами в C# и его влияние на производительность.

9. Чем отличается == и Equals() для строк в C#?

  • Вопрос направлен на различие между сравнением по значению и сравнением по ссылке.

10. Какая максимальная длина строки в C#?

  • Простой вопрос, который помогает проверить, понимает ли кандидат особенности работы с памятью и ограничениями платформы.

11. Какие виды делегатов существуют в C#?

  • Ожидается знание различных типов делегатов и их применения в C#.

12. Что такое паттерн “Мост” (Bridge) в контексте C#?

  • Вопрос на знание структурных паттернов проектирования.

13. Как бы вы реализовали многопоточную программу с ограничением на количество потоков?

  • Здесь важно понимание работы с многозадачностью, потоками и механизмами синхронизации.

14. В чем различие между Task.Run() и Task.Factory.StartNew()?

  • Это вопрос, проверяющий знания о механизмах запуска задач и тонкостях работы с Task в C#.

15. Что такое “deadlock” и как избежать его в C#?

  • Проверка знания основ синхронизации потоков и методов предотвращения взаимных блокировок.

16. Можете ли вы привести пример использования yield return и его преимуществ?

  • Вопрос на знание работы с итераторами и ленивыми вычислениями в C#.

17. Как бы вы объяснили различия между ref и out параметрами?

  • Классический вопрос, который поможет разобраться в тонкостях передачи параметров по ссылке.

18. Что такое dependency injection, и как это можно реализовать в C#?

  • Вопрос, направленный на понимание принципов инверсии зависимостей и того, как это делается в .NET.

19. Что будет, если попытаться открыть уже закрытое соединение с базой данных в C#?

  • Проверка знаний об обработке ошибок при работе с внешними ресурсами и подключениям.

20. Как вы можете организовать безопасный доступ к данным в многозадачной среде?

  • Ожидается знание различных механизмов синхронизации и способов защиты данных от гонки потоков.

21. Какие ограничения у свойств C# в контексте сериализации?

  • Проверка на знание особенностей работы с сериализацией объектов в C# и потенциальных ограничений.

22. Что такое dynamic в C#, и когда его следует использовать?

  • Вопрос на понимание использования динамической типизации и её влияния на производительность и безопасность типов.

23. Как работает LINQ и в чем отличие между IEnumerable и IQueryable?

  • Ожидается понимание принципов работы с LINQ и разница между отложенными и немедленными запросами.

24. Как правильно реализовать паттерн Singleton в многозадачной среде?

  • Вопрос на проверку понимания многозадачности и обеспечения безопасного доступа к единственному экземпляру класса.

25. Какие изменения были внесены в C# 9.0 и как они улучшили работу с записями и кортежами?

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

22 вопроса с кодом

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

1. Что выведет следующий код?

int a = 5;
int b = 10;
Console.WriteLine(a > b ? "A больше B" : "A меньше B");

Ответ: Выведет “A меньше B”. Т.к. условие a > b ложное, сработает альтернативная часть тернарного оператора.


2. Что будет выведено в консоль при следующем коде?

object x = 5;
x = (int)x + 2;
Console.WriteLine(x);

Ответ: Произойдёт ошибка компиляции. Вы пытаетесь присвоить результат операции типа int обратно переменной типа object, что вызывает проблему приведения типов.


3. Какой результат будет при выполнении следующего кода?

int[] array = new int[] { 1, 2, 3 };
Console.WriteLine(array[3]);

Ответ: Исключение IndexOutOfRangeException, т.к. индексы массива начинаются с 0, и допустимые индексы для массива длины 3 — 0, 1 и 2.


4. Как исправить утечку памяти в следующем коде?

public class MyClass
{
    private List<int> list = new List<int>();

    public void AddToList()
    {
        for (int i = 0; i < 1000000; i++)
        {
            list.Add(i);
        }
    }
}

Ответ: Необходимо ограничить размер списка или использовать другую структуру данных (например, LinkedList<T> или кэш с ограничением), чтобы предотвратить переполнение памяти.


5. Как правильно реализовать метод, чтобы он корректно работал с null значениями и не выбрасывал исключений?

public string Concatenate(string str1, string str2)
{
    return str1 + str2;
}

Ответ:

public string Concatenate(string str1, string str2)
{
    return (str1 ?? "") + (str2 ?? "");
}

Заменяем null на пустую строку, чтобы избежать исключений.


6. Что будет выведено в консоль при следующем коде?

int[] arr = { 1, 2, 3 };
arr = arr.Select(x => x * 2).ToArray();
Console.WriteLine(arr[0]);

Ответ: Выведет 2, т.к. с помощью LINQ все элементы массива были умножены на 2, и первый элемент стал равен 2.


7. Объясните следующий код и его поведение. Что будет выведено?

int x = 10;
int y = x;
y = 20;
Console.WriteLine(x);

Ответ: Выведет 10, потому что переменная y является копией значения переменной x. При изменении y, x остаётся неизменным.


8. Что произойдёт при выполнении следующего кода?

string s1 = "hello";
string s2 = "hello";
Console.WriteLine(object.ReferenceEquals(s1, s2));

Ответ: Выведет true. В C# строки являются неизменяемыми, и одинаковые строковые литералы хранятся в пуле строк, поэтому оба объекта будут ссылаться на один и тот же экземпляр в памяти.


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

public class MyClass
{
    public string GetString()
    {
        return null;
    }
}

Ответ:

MyClass myClass = new MyClass();
Console.WriteLine(myClass?.GetString() ?? "Default Value");

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


10. Напишите метод, который будет возвращать максимальное значение в массиве с использованием LINQ.

public int FindMaxValue(int[] numbers)
{
    return numbers.Max();
}

Ответ: В данном случае используется метод Max() из LINQ для нахождения максимального значения в массиве.


11. Что будет выведено при выполнении следующего кода?

int[] array = { 1, 2, 3, 4, 5 };
int[] newArray = array.Take(3).ToArray();
Console.WriteLine(newArray.Length);

Ответ: Выведет 3, потому что метод Take(3) выбирает первые 3 элемента из массива.


12. Что происходит при вызове метода Thread.Sleep(0)?

Ответ: Метод Thread.Sleep(0) позволяет текущему потоку временно освободить процессор, предоставляя другим потокам возможность работать. Но в некоторых случаях это может не привести к немедленному переключению потока, если система не требует этого.


13. Напишите код, который выбрасывает исключение ArgumentNullException, если строка пустая или равна null.

public void ValidateString(string str)
{
    if (string.IsNullOrEmpty(str))
    {
        throw new ArgumentNullException(nameof(str), "Строка не может быть пустой или null");
    }
}

Ответ: Используем метод string.IsNullOrEmpty() для проверки строки и выбрасываем исключение с помощью ArgumentNullException.


14. Что будет выведено в консоль при следующем коде?

int i = 10;
int j = ++i * 2;
Console.WriteLine(j);

Ответ: Выведет 22. Оператор ++i увеличивает значение i на 1 до выполнения умножения.


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

object obj = "Hello";
string str = (string)obj;

Ответ:

object obj = "Hello";
string str = obj as string;
if (str != null)
{
    Console.WriteLine(str);
}
else
{
    Console.WriteLine("Невозможно привести объект к строке.");
}

Используем as, который безопасно возвращает null, если приведение невозможно.


16. Что будет выведено при следующем коде?

int a = 5;
int b = 10;
bool result = a < b && b > a;
Console.WriteLine(result);

Ответ: Выведет true, потому что оба условия истинны (a < b и b > a).


17. Напишите код для эффективного слияния двух отсортированных списков в один отсортированный список.

public List<int> MergeSortedLists(List<int> list1, List<int> list2)
{
    List<int> result = new List<int>();
    int i = 0, j = 0;
    
    while (i < list1.Count && j < list2.Count)
    {
        if (list1[i] < list2[j])
            result.Add(list1[i++]);
        else
            result.Add(list2[j++]);
    }
    
    result.AddRange(list1.Skip(i));
    result.AddRange(list2.Skip(j));
    
    return result;
}

Ответ: Используем два указателя для последовательного добавления меньших элементов в итоговый список.


18. Как решить проблему гонки потоков при изменении общего ресурса?

Ответ:

private static readonly object lockObject = new object();

public void IncrementCounter()
{
    lock (lockObject)
    {
        counter++;
    }
}

Используем блокировку с помощью lock для синхронизации доступа к ресурсу.


19. Что будет выведено при следующем коде?

string a = "world";
string b = a;
b = b.ToUpper();
Console.WriteLine(a);

Ответ: Выведет world. Строки в C# неизменяемы, так что изменение строки b не влияет на a.


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

public int FindMaxValue(IEnumerable<int> collection1, IEnumerable<int> collection2)
{
    return collection1.Concat(collection2).Max();
}

Ответ: Используем метод Concat() для объединения двух коллекций и затем применяем Max().


21. Как можно решить проблему с числовым переполнением в C#?

Ответ:

int a = int.MaxValue;
int b = 1;

try
{
    checked
{
    int result = a + b;
    Console.WriteLine(result);
}

} catch (OverflowException) { Console.WriteLine(“Произошло переполнение!”); }


Используем ключевое слово `checked`, чтобы активировать проверку на переполнение.

---

### 22. **Как работает метод `Array.Sort()` и какие ограничения у него?**

**Ответ:** Метод `Array.Sort()` использует алгоритм быстрой сортировки или сортировки слиянием (в зависимости от версии .NET) и может быть неэффективен для слишком больших или почти отсортированных массивов.

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

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

Вот 20 вопросов с кодом для собеседования с C# разработчиком по теме веб-разработки, которые помогут проверить знания и навыки работы с ASP.NET Core, веб-сервисами, HTTP, а также понимание принципов работы с REST API, MVC и других технологий, связанных с веб-разработкой.


1. Что будет выведено на экране при следующем запросе в ASP.NET Core MVC?

public class HomeController : Controller
{
public IActionResult Index()
{
return View("Index", "Hello, world!");
}
}

Ответ: Hello, world! — строка передаётся как модель в представление. Она будет доступна в представлении Index.cshtml.


2. Как в ASP.NET Core контроллер обрабатывает запрос с параметром строки из URL?

public class ProductController : Controller
{
public IActionResult Details(int id, string name)
{
return Content($"Product ID: {id}, Name: {name}");
}
}

Ответ: В результате запроса /Product/Details/1?name=Phone будет выведено: Product ID: 1, Name: Phone. Параметры будут автоматически привязаны к аргументам метода.


3. Что будет выведено при отправке следующего POST-запроса?

csharpКопировать кодpublic class HomeController : Controller
{
    [HttpPost]
    public IActionResult SubmitForm(string name)
    {
        return Content($"Name: {name}");
    }
}

Ответ: Если отправить POST-запрос с полем name, например, name=John, то будет выведено: Name: John.


4. Как настроить маршрутизацию в ASP.NET Core MVC, чтобы она поддерживала динамическое определение маршрутов?

csharpКопировать кодpublic class Startup
{
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        app.UseRouting();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller}/{action}/{id?}");
        });
    }
}

Ответ: В этом примере маршрутизация настроена так, чтобы динамически привязывать запросы к соответствующим контроллерам и действиям. Параметр id является необязательным.


5. Как передать данные из контроллера в представление в ASP.NET Core MVC?

csharpКопировать кодpublic class HomeController : Controller
{
    public IActionResult Index()
    {
        ViewData["Message"] = "Hello from Controller";
        return View();
    }
}

Ответ: В представлении можно обратиться к ViewData["Message"] для получения строки "Hello from Controller".


6. Как сделать редирект на другой контроллер в ASP.NET Core MVC?

csharpКопировать кодpublic class HomeController : Controller
{
    public IActionResult RedirectToAbout()
    {
        return RedirectToAction("Index", "About");
    }
}

Ответ: Этот код выполняет редирект с текущего действия на действие Index контроллера About.


7. Как добавить middleware для логирования запросов в ASP.NET Core?

csharpКопировать кодpublic class Startup
{
    public void Configure(IApplicationBuilder app)
    {
        app.Use(async (context, next) =>
        {
            Console.WriteLine($"Request: {context.Request.Method} {context.Request.Path}");
            await next();
        });
    }
}

Ответ: Этот middleware будет логировать каждый HTTP-запрос перед его обработкой. Путь и метод запроса будут выведены в консоль.


8. Как обрабатывать ошибки в ASP.NET Core с использованием глобального фильтра?

csharpКопировать кодpublic class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews(options =>
        {
            options.Filters.Add(new HandleErrorAttribute());
        });
    }
}

Ответ: HandleErrorAttribute будет перехватывать ошибки, генерируя страницу ошибки для пользователя. Это глобальный фильтр обработки ошибок.


9. Что будет выведено на страницу при следующем коде?

public class HomeController : Controller
{
public IActionResult Index()
{
var model = new { Name = "Alice", Age = 30 };
return View(model);
}
}

Ответ: В представлении можно будет получить доступ к свойствам модели, например, @Model.Name и @Model.Age. Выведет: Alice 30.


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

public class AccountController : Controller
{
public IActionResult Login()
{
HttpContext.Session.SetString("UserName", "Alice");
return RedirectToAction("Index", "Home");
}

public IActionResult Index()
{
string userName = HttpContext.Session.GetString("UserName");
if (userName == null)
{
return RedirectToAction("Login");
}
return Content($"Hello, {userName}");
}
}

Ответ: При успешном входе, имя пользователя будет сохранено в сессии. Метод Index проверяет наличие имени в сессии и выводит приветствие.


11. Как работать с куки в ASP.NET Core?

public class HomeController : Controller
{
public IActionResult SetCookie()
{
Response.Cookies.Append("User", "Alice", new CookieOptions { Expires = DateTimeOffset.UtcNow.AddDays(1) });
return Content("Cookie set!");
}

public IActionResult GetCookie()
{
string user = Request.Cookies["User"];
return Content($"User cookie: {user}");
}
}

Ответ: SetCookie сохраняет куки с именем “User”, а GetCookie извлекает его значение.


12. Как настроить в ASP.NET Core Middleware для авторизации?

public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication("Cookies")
.AddCookie(options =>
{
options.LoginPath = "/Account/Login";
});
}

public void Configure(IApplicationBuilder app)
{
app.UseAuthentication();
app.UseAuthorization();
}
}

Ответ: Этот middleware добавляет поддержку аутентификации и авторизации с использованием cookies.


13. Что выведет следующий код при вызове GET-запроса?

public class HomeController : Controller
{
[HttpGet] public string Get()
{
return "Hello, GET request!";
}
}

Ответ: Выведет "Hello, GET request!" при GET-запросе по маршруту, связанному с этим методом.


14. Как в ASP.NET Core создать API-метод, который принимает JSON и возвращает JSON?

csharpКопировать код[ApiController]
[Route("api/[controller]")]
public class ValuesController : ControllerBase
{
    [HttpPost]
    public ActionResult<string> Post([FromBody] DataModel model)
    {
        return Ok(new { message = "Data received", data = model });
    }
}

Ответ: Этот метод принимает JSON как модель и возвращает JSON с сообщением и полученными данными.


15. Как настроить маршрутизацию для API в ASP.NET Core?

public class Startup
{
public void Configure(IApplicationBuilder app)
{
app.UseRouting();

app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}

Ответ: MapControllers настраивает маршрутизацию для API, чтобы методы контроллеров были доступными по маршруту.


16. Как передать параметры в строке запроса для метода API в ASP.NET Core?

[HttpGet]public IActionResult Get([FromQuery] string name)
{
return Content($"Hello, {name}");
}

Ответ: Параметр name будет извлечён из строки запроса, например, /api/values?name=John.


17. Как добавить валидацию модели в ASP.NET Core?

Ответ: Для того, чтобы модель была валидной, необходимо использовать атрибуты валидации, такие как [Required] и [Range]. В контроллере можно проверить модель через ModelState.IsValid.

public class Person
{
[Required] public string Name { get; set; }

[Range(18, 100)] public int Age { get; set; }
}

18. Как создать пагинацию для списка в ASP.NET Core API?

public class ProductController : ControllerBase
{
[HttpGet] public IActionResult Get(int page = 1, int pageSize = 10)
{
var products = GetProductsFromDb().Skip((page - 1) * pageSize).Take(pageSize);
return Ok(products);
}
}

Ответ: Используем Skip и Take для реализации пагинации, передавая параметры страницы и размера

Вот ещё 20 вопросов для собеседования с C# разработчиком уровня middle. Эти вопросы охватывают различные аспекты языка C#, архитектуры приложений, ООП, асинхронного программирования, коллекций, работы с потоками, обработкой ошибок и многого другого. Каждый вопрос направлен на проверку как теоретических знаний, так и практических навыков.


1. Что такое инкапсуляция, и как её реализовать в C#?

  • Ответ: Инкапсуляция — это принцип ООП, при котором детали реализации скрыты от внешнего мира. В C# инкапсуляция реализуется с помощью модификаторов доступа (private, protected, public), а также через свойства и методы.

2. Какая разница между String и StringBuilder в C#? Когда следует использовать каждый из них?

  • Ответ: String — это неизменяемый тип, каждый раз при изменении строки создается новый объект. StringBuilder используется для модификации строк в цикле или в случаях, когда требуется большое количество изменений. Он более эффективен, чем String, при множественных изменениях строк.

3. Что такое Task и Thread в C#? Как они различаются?

  • Ответ: Thread представляет собой отдельный поток выполнения, который управляется операционной системой. Task — это более абстрактный объект, представляющий асинхронную операцию, и используется для упрощения многозадачности. Task часто использует пул потоков, что снижает накладные расходы по сравнению с явным созданием потоков.

4. Как работает сборка мусора в .NET? Что такое поколения?

  • Ответ: Сборщик мусора (GC) в .NET автоматически управляет памятью, освобождая неиспользуемые объекты. Объекты делятся на три поколения (Generation 0, Generation 1, Generation 2). Объекты в младших поколениях собираются чаще, а в старших реже, что повышает производительность.

5. Что такое yield и как его использовать в C#?

  • Ответ: Ключевое слово yield используется для создания итераторов. Оно позволяет методу возвращать элементы по одному, не создавая все элементы сразу в памяти. Это полезно для работы с большими коллекциями или потоками данных.

6. Как работает обработка исключений в C#? Что такое try-catch-finally?

  • Ответ: try-catch-finally — это блоки для обработки исключений. Код в блоке try выполняется, если исключение не возникает, в catch обрабатываются ошибки, а в finally выполняется код, который должен быть выполнен всегда (например, освобождение ресурсов).

7. Что такое async и await? Когда они используются?

  • Ответ: async указывает, что метод выполняет асинхронную операцию, а await используется для ожидания завершения асинхронной задачи. Эти ключевые слова используются для упрощения работы с асинхронными операциями, такими как I/O операции или HTTP-запросы.

8. Что такое и как работает async метод, если в нем нет оператора await?

  • Ответ: Если в асинхронном методе нет await, он выполнится синхронно, но будет все равно возвращать Task. Это не приведет к ошибке, но лишает метод его асинхронной природы.

9. Как работает делегат в C#? Приведите пример его использования.

  • Ответ: Делегаты в C# — это типы, которые представляют ссылки на методы. Пример:
csharpКопировать кодdelegate void GreetDelegate(string name);

GreetDelegate greet = name => Console.WriteLine($"Hello, {name}!");
greet("Alice");

10. Что такое событие и как его реализовать в C#?

  • Ответ: Событие — это механизм для уведомления других объектов об изменении состояния. Оно базируется на делегатах. Пример:
csharpКопировать кодpublic event EventHandler OnCompleted;
protected virtual void RaiseEvent()
{
    OnCompleted?.Invoke(this, EventArgs.Empty);
}

11. Какая разница между interface и abstract class в C#?

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

12. Как работает LINQ в C#? Приведите пример использования.

  • Ответ: LINQ (Language Integrated Query) позволяет выполнять запросы к коллекциям данных прямо в коде. Пример:
csharpКопировать кодvar numbers = new List<int> { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(n => n % 2 == 0).ToList();

13. Что такое паттерн проектирования Singleton и как его реализовать в C#?

  • Ответ: Паттерн Singleton гарантирует, что класс будет иметь только один экземпляр и предоставляет глобальную точку доступа. Пример реализации:
csharpКопировать кодpublic class Singleton
{
    private static Singleton _instance;
    private Singleton() { }
    public static Singleton Instance => _instance ??= new Singleton();
}

14. Что такое полиморфизм и как его реализовать в C#?

  • Ответ: Полиморфизм позволяет использовать один интерфейс для работы с объектами разных типов. В C# его можно реализовать через виртуальные методы и переопределение (override).
csharpКопировать кодpublic class Animal
{
    public virtual void Speak() => Console.WriteLine("Animal speaks");
}

public class Dog : Animal
{
    public override void Speak() => Console.WriteLine("Woof!");
}

15. Что такое null-ссылки и как можно избежать ошибок, связанных с ними в C#?

  • Ответ: null-ссылки — это ссылки, которые не указывают на объект. Для избежания ошибок можно использовать оператор ?. (null-условный оператор) и ?? (оператор объединения с null).
csharpКопировать кодstring name = person?.Name ?? "Unknown";

16. Что такое boxing и unboxing в C#? Приведите пример.

  • Ответ: Boxing — это преобразование значения типа в ссылочный тип (object), а Unboxing — это обратное преобразование. Пример:
csharpКопировать кодint i = 42;
object obj = i; // Boxing
int j = (int)obj; // Unboxing

17. Что такое “thread-safe” в C# и как реализовать потокобезопасную коллекцию?

  • Ответ: Потокобезопасность означает, что коллекция или объект могут безопасно использоваться в многозадачной среде. Пример потокобезопасной коллекции:
csharpКопировать кодvar list = new ConcurrentBag<int>();
list.Add(1);

18. Что такое enum в C# и как его использовать?

  • Ответ: enum — это специальный тип для работы с набором связанных именованных целых значений. Пример:
csharpКопировать кодenum Days { Sunday, Monday, Tuesday, Wednesday }
var today = Days.Monday;

19. Как в C# работает оператор is? Приведите пример его использования.

  • Ответ: Оператор is используется для проверки типа объекта. Пример:
csharpКопировать кодobject obj = "Hello";
if (obj is string str)
{
    Console.WriteLine(str); // Выведет "Hello"
}

20. Как избежать “deadlock” в многозадачных приложениях на C#?

  • Ответ: Чтобы избежать взаимных блокировок, следует использовать принципы, такие как:
    • Избегать вложенных блокировок (не захватывать несколько ресурсов в одном потоке).
    • Использовать Monitor.TryEnter вместо lock для предотвращения блокировки.
    • Применять асинхронное программирование для освобождения блокировок.

Эти вопросы позволят вам оценить как теоретические знания кандидата, так и его практические навыки в реальных задачах, с которыми сталкиваются middle-разработчики на C#.

+1
0
+1
0
+1
0
+1
0
+1
0

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *