C# собеседования
753 subscribers
104 photos
222 links
Подготовка к собеседованиям на позицию C#-разработчик

Еще больше на сайте https://frontview-it.ru

Backend собеседования - @frontview_backend
C# работа - @frontview_csharp_vacancies
Все IT вакансии - @frontview_all_vacancies
Download Telegram
🔥 Что такое абстрактный класс и когда его использовать?

Абстрактный класс в C# — это класс, который не может быть создан напрямую и предназначен для использования в качестве базового. Он может содержать как абстрактные методы (без реализации), так и методы с реализацией.

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

Например:


// Определение абстрактного класса Animal
public abstract class Animal
{
// Абстрактный метод MakeSound, требующий реализации в подклассах
public abstract void MakeSound();

// Обычный метод, доступный всем подклассам
public void Sleep()
{
Console.WriteLine("Sleeping");
}
}

// Класс Dog наследует Animal и реализует метод MakeSound
public class Dog : Animal
{
public override void MakeSound()
{
Console.WriteLine("Bark");
}
}


В этом примере Animal — абстрактный класс с абстрактным методом MakeSound. Класс Dog наследует Animal и предоставляет реализацию метода MakeSound. Таким образом, абстрактные классы позволяют определять общий контракт для подклассов, обеспечивая гибкость и расширяемость кода.

Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
🔥 Объясни различие между делегатами и интерфейсами

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

Делегаты — это типы, представляющие ссылки на методы. Они позволяют сохранить метод в переменной и вызывать его динамически. Это особенно полезно для обратных вызовов и событий.

Пример использования делегата:


// Определение делегата, принимающего строку и возвращающего число
public delegate int StringToIntDelegate(string input);

// Метод, соответствующий делегату
public int GetStringLength(string input)
{
return input.Length;
}

// Использование делегата
StringToIntDelegate del = GetStringLength;
int length = del("Hello");
// length будет равен 5


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

Пример использования интерфейса:


// Определение интерфейса
public interface ILogger
{
void Log(string message);
}

// Класс, реализующий интерфейс
public class ConsoleLogger : ILogger
{
public void Log(string message)
{
Console.WriteLine(message);
}
}

// Использование интерфейса
ILogger logger = new ConsoleLogger();
logger.Log("Logging message");


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

Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
🔥 Объясни разницу между LINQ to Objects, LINQ to SQL и LINQ to XML

LINQ (Language Integrated Query) предоставляет единый синтаксис для работы с разными источниками данных. Различия между LINQ to Objects, LINQ to SQL и LINQ to XML заключаются в типе данных, к которым они применяются.

LINQ to Objects работает с коллекциями в памяти, реализующими IEnumerable или IEnumerable<T>.


var numbers = new[] { 1, 2, 3, 4, 5 };
// Получение чётных чисел
var evenNumbers = numbers.Where(n => n % 2 == 0);


LINQ to SQL позволяет взаимодействовать с базами данных SQL Server. Запросы на C# преобразуются в SQL.


DataContext db = new DataContext(connectionString);
// Получение клиентов из Лондона
var customers = db.GetTable<Customer>().Where(c => c.City == "London");


LINQ to XML предназначен для работы с XML-документами.


XDocument xmlDoc = XDocument.Load("data.xml");
// Получение элементов с Id > 100
var items = xmlDoc.Descendants("Item")
.Where(x => (int)x.Attribute("Id") > 100);


Таким образом, LINQ to Objects оперирует коллекциями в памяти, LINQ to SQL работает с базами данных, а LINQ to XML — с XML-документами.

Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
🔥 Что такое async void и когда его можно использовать?

async void — это асинхронный метод в C#, который не возвращает значения и не возвращает Task или Task<T>. Использование async void не рекомендуется, так как такие методы сложно контролировать: невозможно ожидать их завершения с помощью await, и обработка исключений затруднена.

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

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

Пример использования async void в обработчике события:


private async void Button_Click(object sender, EventArgs e)
{
// Выполняем асинхронную операцию
await LongRunningOperationAsync();
}

private Task LongRunningOperationAsync()
{
// Длительная операция
return Task.Delay(1000);
}


В этом примере обработчик события Button_Click объявлен как async void и использует await для асинхронного выполнения длительной операции.

Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
🔥 Объясни работу с SqlConnection, SqlCommand и SqlDataReader

SqlConnection, SqlCommand и SqlDataReader используются для взаимодействия с базой данных SQL Server в C#.

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

SqlCommand выполняет SQL-команды (SELECT, INSERT, UPDATE, DELETE) через открытое соединение SqlConnection.

SqlDataReader читает данные, возвращаемые SqlCommand. Он позволяет эффективно считывать строки результатов по очереди.

Пример:


string connectionString = "Data Source=server;Initial Catalog=database;Integrated Security=True;";

using (SqlConnection connection = new SqlConnection(connectionString))
{
// Открываем соединение
connection.Open();

string query = "SELECT * FROM Users";

using (SqlCommand command = new SqlCommand(query, connection))
{
// Выполняем команду и получаем reader
using (SqlDataReader reader = command.ExecuteReader())
{
// Читаем данные построчно
while (reader.Read())
{
// Получаем данные из столбцов
int id = reader.GetInt32(0);
string name = reader.GetString(1);
// Обрабатываем данные
}
}
}
}


В этом примере устанавливается соединение с базой данных, выполняется SQL-запрос и результаты считываются с помощью SqlDataReader. Использование using гарантирует корректное освобождение ресурсов.

Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
🔥 Объясни концепцию пространства имен (namespace) в C#

В C# пространство имен (namespace) — это способ организации кода и группировки связанных классов, структур, интерфейсов и других типов. Это помогает избежать конфликтов имен, особенно в больших проектах или при использовании сторонних библиотек.

Например:


namespace MyApplication.Utilities
{
// Класс Helper находится в пространстве имен MyApplication.Utilities
public class Helper
{
public void DoSomething()
{
// Реализация метода
}
}
}

namespace MyApplication.Models
{
// Класс User находится в пространстве имен MyApplication.Models
public class User
{
public string Name { get; set; }
}
}


Чтобы использовать классы из другого пространства имен, применяется директива using:


using MyApplication.Utilities;

public class Program
{
public static void Main()
{
// Создание экземпляра класса Helper из пространства имен MyApplication.Utilities
Helper helper = new Helper();
helper.DoSomething();
}
}


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

Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
🔥 Что такое стэк и куча?

В C# память разделена на стэк и кучу, которые используются для хранения различных типов данных.

Стэк — это область памяти, предназначенная для хранения значений типов-значений (value types), таких как int, double, struct, а также информации о вызовах методов. Данные в стэке хранятся последовательно и имеют ограниченную область видимости в пределах метода. Стэк работает по принципу LIFO (Last-In, First-Out), что обеспечивает быстрый доступ к данным.

Куча — это область памяти для хранения объектов ссылочных типов (reference types), таких как классы и массивы. Объекты в куче могут существовать после завершения метода, в котором они были созданы, если на них есть ссылки. Управление памятью в куче осуществляется сборщиком мусора (Garbage Collector), который освобождает неиспользуемые объекты.

Пример:


// Переменная value type; хранится в стэке
int number = 42;

// Объект reference type; ссылка хранится в стэке, сам объект — в куче
MyClass obj = new MyClass();


В этом примере number хранится в стэке, а obj — это ссылка в стэке на объект MyClass в куче. Понимание разницы между стэком и кучей важно для оптимизации производительности приложения и эффективного использования памяти.

Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥1
🔥 Объясни разницу между синхронными и асинхронными операциями с файлами

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

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

Пример синхронного чтения файла:


// Синхронное чтение файла
string content = File.ReadAllText("file.txt");


Пример асинхронного чтения файла:


// Асинхронное чтение файла
string content = await File.ReadAllTextAsync("file.txt");


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

Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31
🔥 Что такое паттерн Factory и как его применять?

Паттерн Factory (Фабрика) — это порождающий паттерн проектирования, который предоставляет способ создания объектов без указания точных классов создаваемых объектов. Это позволяет делать код более гибким и расширяемым.

Пример использования паттерна Factory:


// Абстрактный продукт
public abstract class Vehicle
{
public abstract void Drive();
}

// Конкретные продукты
public class Car : Vehicle
{
public override void Drive()
{
// Реализация для автомобиля
Console.WriteLine("Driving a car");
}
}

public class Bike : Vehicle
{
public override void Drive()
{
// Реализация для мотоцикла
Console.WriteLine("Riding a bike");
}
}

// Фабрика
public class VehicleFactory
{
public static Vehicle GetVehicle(string type)
{
// Создание объекта в зависимости от типа
switch (type)
{
case "Car":
return new Car();
case "Bike":
return new Bike();
default:
throw new ArgumentException("Invalid type");
}
}
}


Использование фабрики:


// Получение объекта через фабрику
Vehicle vehicle = VehicleFactory.GetVehicle("Car");
vehicle.Drive(); // Вывод: Driving a car


Преимущества паттерна Factory:

- Инкапсуляция создания объектов: Клиентский код не зависит от конкретных классов.
- Легкость расширения: Новые типы объектов можно добавлять без изменения существующего кода фабрики.
- Снижение связанности: Упрощает поддержку и тестирование кода.

Паттерн Factory полезен, когда требуется создать объекты без привязки к конкретным классам, особенно если тип создаваемого объекта определяется во время выполнения.

Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥2
Подписывайся на наши новые каналы!

👩‍💻 Git
🖥 SQL
👩‍💻 QA
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥 Что такое Razor и как он используется в ASP.NET MVC?

Razor — это синтаксис шаблонов представлений в ASP.NET MVC, который позволяет комбинировать C# код с HTML для динамической генерации веб-страниц. Он обеспечивает удобный и лаконичный способ интеграции серверного кода в представления, облегчая разработку и поддержку приложений.

Пример использования Razor в представлении:


@model MyApp.Models.User

<!DOCTYPE html>
<html>
<head>
<title>User Profile</title>
</head>
<body>
<h1>@Model.Name</h1> <!-- Отображение имени пользователя -->
<p>Email: @Model.Email</p> <!-- Отображение email пользователя -->

<!-- Условный вывод на основе серверной логики -->
@if(Model.IsAdmin)
{
<p>Administrator Access</p>
}
else
{
<p>Standard User</p>
}
</body>
</html>


В этом примере @ используется для перехода от HTML к C# коду. Синтаксис Razor позволяет вставлять переменные, выполнять условия и циклы прямо в представлении.

Основные преимущества Razor:

- Простой синтаксис: Минимум элементов шаблонизации, что делает код более читаемым.
- Интеграция с C#: Полная поддержка C# с возможностью использования пространства имен, классов и методов.
- Высокая производительность: Представления компилируются в классы, что ускоряет их выполнение.
- Поддержка IntelliSense: Помощь при написании кода в Visual Studio.

Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
🔥 Какие фреймворки для unit-тестирования существуют в C#?

В C# доступны несколько фреймворков для юнит-тестирования, наиболее популярные из них:

1. MSTest

Стандартный фреймворк от Microsoft, интегрированный в Visual Studio.

2. NUnit

Один из самых известных фреймворков, предоставляющий широкий набор атрибутов и возможностей.

3. xUnit

Современный фреймворк, фокусирующийся на расширяемости и гибкости.

4. MBUnit (Gallio)

Фреймворк, расширяющий возможности NUnit, включая параметризованные тесты и другие функции.

5. Fixie

Гибкий фреймворк, позволяющий настроить конвенции для написания и выполнения тестов.

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

Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
🔥 Объясни разницу между try-catch и try-finally

try-catch и try-finally — это конструкции для обработки исключений в C#.

try-catch

try-catch используется для перехвата и обработки исключений, возникающих в блоке try. Если в блоке try происходит исключение, управление передается в соответствующий блок catch, где можно обработать ошибку.

Пример:


try
{
// Код, который может вызвать исключение
int result = 10 / divisor;
}
catch (DivideByZeroException ex)
{
// Обработка исключения деления на ноль
Console.WriteLine("Деление на ноль невозможно");
}


try-finally

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

Пример:


FileStream file = null;
try
{
// Открытие файла для чтения
file = File.Open("data.txt", FileMode.Open);
// Чтение данных из файла
}
finally
{
// Гарантированное закрытие файла
if (file != null)
file.Close();
}


Ключевые различия:

- try-catch используется для перехвата и конкретной обработки исключений.
- try-finally гарантирует выполнение кода в блоке finally независимо от исключений, что полезно для очистки ресурсов.

Также возможно комбинировать оба:


try
{
// Код, который может вызвать исключение
}
catch (Exception ex)
{
// Обработка исключения
}
finally
{
// Код, который всегда выполнится
}


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

Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
🔥 Что такое Identity Framework и как его использовать?

Identity Framework — это система для аутентификации и авторизации в приложениях ASP.NET Core. Она позволяет добавлять функциональность регистрации, входа, сброса пароля и управления ролями.

Для настройки Identity Framework:


// Регистрация ApplicationDbContext с использованием SQL Server
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

// Добавление сервисов Identity
services.AddIdentity<IdentityUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();


В контроллерах можно использовать _userManager и _signInManager для управления пользователями:


// Создание нового пользователя
var user = new IdentityUser { UserName = model.Email, Email = model.Email };
var result = await _userManager.CreateAsync(user, model.Password);

// Вход пользователя
var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, false);


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

Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍81
🔥 Объясни процесс сборки мусора в .NET

Garbage Collection (GC) в .NET — автоматический процесс управления памятью, который освобождает память, занятую объектами, недостижимыми из кода.

GC разделяет управляемую кучу на поколения: 0, 1 и 2. Новые объекты помещаются в поколение 0. При сборке мусора поколение 0 проверяется первым. Объекты, пережившие сборку, перемещаются в следующее поколение, что повышает эффективность, так как короткоживущие объекты удаляются быстрее.

Принудительный вызов сборки мусора возможен, но не рекомендуется, так как может снизить производительность:


GC.Collect(); // Принудительный вызов GC (не рекомендуется)


Для правильного управления неуправляемыми ресурсами следует реализовать интерфейс IDisposable и метод Dispose:


public class ResourceHolder : IDisposable
{
private IntPtr unmanagedResource; // Неуправляемый ресурс

public void Dispose()
{
// Освобождение неуправляемого ресурса
ReleaseResource(unmanagedResource);
GC.SuppressFinalize(this); // Подавление финализации
}

~ResourceHolder()
{
Dispose();
}
}


Такой подход обеспечивает корректное освобождение ресурсов и интеграцию с GC.

Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
C# собеседования pinned «Подписывайся на наши новые каналы! 👩‍💻 Git 🖥 SQL 👩‍💻 QA»
🔥 Как использовать лямбда-выражения с делегатами?

Лямбда-выражения позволяют создавать анонимные методы и часто используются с делегатами для краткости и удобства.

Например, есть делегат Func<int, int>:


// Делегат, принимающий int и возвращающий int
Func<int, int> square = x => x * x;


Здесь x => x * x — лямбда-выражение, которое присваивается делегату square.

Лямбда-выражения могут быть переданы как аргументы метода:


// Метод, принимающий делегат
void Process(Func<int, int> operation)
{
// Вызов делегата с аргументом 5
int result = operation(5);
Console.WriteLine(result);
}

// Вызов метода с лямбда-выражением
Process(x => x + 10);


Также можно использовать лямбда-выражения с LINQ:


int[] numbers = { 1, 2, 3, 4, 5 };

// Использование лямбда-выражения в методе Where
var evenNumbers = numbers.Where(n => n % 2 == 0);

foreach (var n in evenNumbers)
{
Console.WriteLine(n); // Выводит четные числа
}


Таким образом, лямбда-выражения упрощают работу с делегатами, делая код более лаконичным и удобочитаемым.

Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🔥 Что такое асинхронное программирование и зачем оно нужно?

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

В C# асинхронность достигается с помощью ключевых слов async и await.


using System.IO;
using System.Threading.Tasks;

// Асинхронный метод чтения файла
async Task<string> ReadFileAsync(string path)
{
// Асинхронное чтение файла
using (StreamReader reader = new StreamReader(path))
{
return await reader.ReadToEndAsync();
}
}


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

При вызове асинхронного метода используется await для ожидания результата:


// Вызов асинхронного метода
string content = await ReadFileAsync("file.txt");


Таким образом, асинхронность помогает эффективно использовать ресурсы и создавать более масштабируемые приложения.

Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
🔥 Как работать с HashSet<T> и в каких случаях он полезен?

HashSet<T> — это коллекция, которая хранит уникальные элементы без определенного порядка. Полезна для быстрого поиска и предотвращения дубликатов.

Пример создания и использования:


// Создание HashSet для строк
HashSet<string> fruits = new HashSet<string>();

// Добавление элементов
fruits.Add("Apple");
fruits.Add("Banana");
fruits.Add("Orange");
fruits.Add("Apple"); // Не будет добавлен, т.к. "Apple" уже есть

// Проверка наличия элемента
bool hasBanana = fruits.Contains("Banana"); // true

// Перебор элементов
foreach (var fruit in fruits)
{
Console.WriteLine(fruit); // Выводит "Apple", "Banana", "Orange" в произвольном порядке
}


HashSet<T> эффективен для задач, где нужны уникальные элементы и быстрые операции поиска, добавления и удаления.

Операции множеств:


HashSet<int> setA = new HashSet<int> { 1, 2, 3 };
HashSet<int> setB = new HashSet<int> { 3, 4, 5 };

// Объединение множеств
setA.UnionWith(setB); // setA теперь содержит 1, 2, 3, 4, 5

// Пересечение множеств
setA.IntersectWith(setB); // setA теперь содержит 3

// Разность множеств
setA.ExceptWith(setB); // setA содержит элементы, которые есть в setA, но нет в setB


HashSet<T> идеален для сценариев, где важна уникальность данных, таких как избавление от дубликатов в списке или выполнение операций над множествами.

Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
🔥 Как использовать несколько блоков catch для разных типов исключений?

В C# можно использовать несколько блоков catch для обработки разных типов исключений. Это позволяет выполнять специфические действия в зависимости от возникшей ошибки.


try
{
// Код, который может вызвать исключение
int[] numbers = { 1, 2, 3 };
int number = numbers[5]; // IndexOutOfRangeException
}
catch (IndexOutOfRangeException ex)
{
// Обработка выхода за пределы массива
Console.WriteLine("Индекс находится за пределами массива.");
}
catch (NullReferenceException ex)
{
// Обработка null-ссылки
Console.WriteLine("Обращение к объекту по null-ссылке.");
}
catch (Exception ex)
{
// Обработка всех остальных исключений
Console.WriteLine($"Произошла ошибка: {ex.Message}");
}


Блоки catch должны располагаться от наиболее специфичных к общим. Первый блок перехватывает IndexOutOfRangeException, второй — NullReferenceException, а третий ловит все остальные исключения.

Также можно использовать фильтры исключений для дополнительной проверки:


try
{
// Код, который может вызвать исключение
}
catch (Exception ex) when (ex.Message.Contains("специфическая ошибка"))
{
// Обработка исключений с определенным сообщением
Console.WriteLine("Обнаружена специфическая ошибка.");
}


Фильтры позволяют обрабатывать исключения на основе условий, что делает обработку более гибкой.

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

Ставь 👍, если было полезно!
Еще больше ответов для подготовки к собеседованиям на сайте 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4