100 вопросов с собеседований для C# разработчиков
![100 вопросов с собеседований для C# разработчиков 100 вопросов сишарп разработчка](https://uproger.com/wp-content/uploads/2024/12/image-2024-12-15-022411.jpg)
Привет, коллеги! Сегодня хочу поделиться списком интересных и нестандартных вопросов, которые могут встретиться на собеседованиях для 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#.