C# | Вопросы собесов
الذهاب إلى القناة على Telegram
Cайт easyoffer.ru Реклама @easyoffer_adv ВП @easyoffer_vp Тесты t.me/+nebTPWgpeGs1OWFi Задачи t.me/+Xy-0H7xKlgo0NDVi Вакансии t.me/+BQFHXZQ0zrViNGIy
إظهار المزيد5 049
المشتركون
+324 ساعات
-147 أيام
-2630 أيام
أرشيف المشاركات
5 049
Прошел тест ASP NET - навыки прокачал, зарплату поднял! 😎
8 бонусов для справившихся - уроки по «горячим» темам, список литературы, карта развития навыков специалиста.
Ну и приличная скидка на курс по C# ASP.NET Core разработчик ждет тебя, смельчак!
✅ Испытание для избранных начинается тут: https://otus.pw/j7A4/?erid=LjN8KSWMh
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
5 049
+9
Помощь в трудоустройстве в IT-сфере!
По всей России объявили бесплатную программу на шестимесячное обучение по IT-cпециальностям.
Запись на участие в программе продлится до конца июля, но чтобы туда попасть, нужно пройти специальный профтест.
По результату тестирования сразу узнаете, какая профессия вам подойдет, и проходите ли вы на бесплатное обучение.
Перейти на сайт
#реклама 16+
urban-university.ru
О рекламодателе
5 049
🤔 Как проводить тестирование и отладку?
Тестирование программного обеспечения включает планирование тестов, их выполнение для проверки функциональности и других аспектов, а отладка занимается устранением найденных в ходе тестирования ошибок через анализ кода и логов.
🟠Использование отладчика (Debugger)
Visual Studio предоставляет мощные инструменты отладки. Основные возможности включают установку точек останова (breakpoints), пошаговое выполнение кода (step over, step into, step out), просмотр значений переменных и выражений.
1⃣Установка точки останова: Нажмите слева от строки кода, где нужно остановиться, или используйте клавишу F9.
2⃣Запуск отладки: Нажмите F5 или выберите "Debug -> Start Debugging".
3⃣Пошаговое выполнение: Используйте F10 (step over), F11 (step into) и Shift+F11 (step out).
🟠Использование `Debug` и `Trace`
Для вывода отладочной информации можно использовать классы
Debug и Trace из пространства имен System.Diagnostics.
using System.Diagnostics;
public class Program
{
public static void Main()
{
Debug.WriteLine("This is a debug message.");
Trace.WriteLine("This is a trace message.");
}
}
🟠Журналирование (Logging)
Использование журналирования позволяет записывать события и ошибки во время выполнения приложения. В .NET Core и ASP.NET Core используется встроенная система логирования.
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
public HomeController(ILogger<HomeController> logger)
{
_logger = logger;
}
public IActionResult Index()
{
_logger.LogInformation("Executing Index method");
return View();
}
}
🟠Анализ дампов памяти
В случае критических ошибок можно анализировать дампы памяти для диагностики проблем. Используйте WinDbg или Visual Studio для анализа дампов.
Ставь 👍 и забирай 📚 Базу знаний5 049
⚡️ IT-обучение теперь в Telegram!
В cвязи с недавнем замедлением Ютуба — лучшие обучающие каналы переехали в Telegram
Вот каналы для айтишников:
👩💻 C#: @Csharp
👩💻 С/С++: @Cpp
👩💻 Разработка игр: @GameDev
📱 GitHub: @GitHub
⚙️ Backend: @Backend
🤓 Общее айти: @portalToIT
👩💻 Python: @Python
👩💻 Frontend: @Frontend
👩💻 Java: @Java
🖥 Базы Данных & SQL: @SQL
👩💻 Golang: @Golang
👩💻 PHP: @PHP
👩💻 Моб. разработка: @MobDev
👩💻 DevOps: @DevOps
🖥 Data Science: @DataScience
🤔 Хакинг & ИБ: @InfoSec
🐞 Тестирование: @QA
📱 Маркетинг: @Marketing
🖥 Дизайн: @Design
➡️ Сохраняйте себе, чтобы не потерять
5 049
🤔 Как работаешь с асинхронными операциями?
Работа с асинхронными операциями в C# важна для создания производительных и отзывчивых приложений, особенно когда дело касается операций ввода-вывода, сетевых запросов или длительных вычислений. В C# для этого используется ключевые слова
async и await, а также Task и Task<T>.
🚩Основные Концепции
🟠Ключевые слова `async` и `await`
`async`: Указывает, что метод является асинхронным и может содержать операторы await.
`await`: Используется для ожидания завершения асинхронной операции без блокировки основного потока.
🟠Task и Task<T>
`Task`: Представляет асинхронную операцию без возвращаемого значения.
`Task<T>`: Представляет асинхронную операцию, возвращающую значение типа T.
🚩Пример Асинхронного Метода
🟠Рассмотрим пример простого асинхронного метода, который выполняет задержку на 2 секунды.
public async Task DelayExampleAsync()
{
Console.WriteLine("Начало задержки");
await Task.Delay(2000); // Асинхронная задержка на 2 секунды
Console.WriteLine("Завершение задержки");
}
🟠Асинхронный Ввод-Вывод
Асинхронные операции ввода-вывода часто используются для работы с файлами, сетевыми запросами и базами данных. Пример асинхронного чтения файла:
public async Task<string> ReadFileAsync(string filePath)
{
using (StreamReader reader = new StreamReader(filePath))
{
return await reader.ReadToEndAsync();
}
}
🟠Асинхронные HTTP-запросы
Для выполнения асинхронных HTTP-запросов можно использовать HttpClient.
public async Task<string> FetchDataFromApiAsync(string url)
{
using (HttpClient client = new HttpClient())
{
HttpResponseMessage response = await client.GetAsync(url);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
}
}
🟠Обработка Исключений в Асинхронных Методах
Обработка исключений в асинхронных методах аналогична синхронным методам, с использованием блоков try-catch.
public async Task<string> SafeFetchDataFromApiAsync(string url)
{
try
{
using (HttpClient client = new HttpClient())
{
HttpResponseMessage response = await client.GetAsync(url);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
}
}
catch (HttpRequestException ex)
{
Console.WriteLine($"Ошибка запроса: {ex.Message}");
return string.Empty;
}
}
🟠Совместное Выполнение Асинхронных Операций
Для выполнения нескольких асинхронных операций параллельно можно использовать Task.WhenAll или Task.WhenAny.
public async Task PerformMultipleTasksAsync()
{
Task<int> task1 = Task.Run(() => ComputeAsync(10));
Task<int> task2 = Task.Run(() => ComputeAsync(20));
int[] results = await Task.WhenAll(task1, task2);
Console.WriteLine($"Результаты: {results[0]}, {results[1]}");
}
public async Task<int> ComputeAsync(int value)
{
await Task.Delay(1000);
return value * value;
}
🟠Пример Полного Асинхронного Приложения
Рассмотрим пример асинхронного метода, который загружает данные из нескольких URL и выводит их размер.
public async Task FetchDataFromMultipleUrlsAsync(string[] urls)
{
List<Task<string>> fetchTasks = new List<Task<string>>();
foreach (string url in urls)
{
fetchTasks.Add(FetchDataFromApiAsync(url));
}
string[] results = await Task.WhenAll(fetchTasks);
foreach (string result in results)
{
Console.WriteLine($"Длина данных: {result.Length}");
}
}
Ставь 👍 и забирай 📚 Базу знаний5 049
+4
Senior-разработчик создал крутейший канал про SQL
Благодаря простым картинкам даже новичок научится разрабатывать приложения с использованием баз данных.
Присоединяйтесь: @SQL
5 049
🔥 Ресурсы для подготовки к работе в IT! 🔥
1️⃣ База собеседований IT – это уникальная коллекция собеседований от реальных топовых компаний: Сбер, Яндекс, ВТБ, Тинькофф, Озон, Wildberries и многие другие! 🏢 Мы собрали 150+ собеседований, чтобы ты мог подготовиться к интервью с уверенностью и успехом.
2️⃣ База тестовых заданий – твоё секретное оружие для успешного прохождения этапов отбора! 📋 Здесь ты найдёшь 121+ тестовых заданий от тех же топовых компаний: Сбер, Яндекс, ВТБ, Тинькофф, Озон, Wildberries. Решай реальные задачи и набирайся опыта для будущих собеседований!
🎯 Присоединяйся к базам и прокачай свои шансы на успешное трудоустройство!
5 049
🤔 Какие принципы и практики используешь для обеспечения безопасности приложений?
🟠Валидация и Санитизация Входных Данных
Валидация входных данных помогает предотвратить атаки, такие как SQL-инъекции, XSS (межсайтовый скриптинг) и другие. SQL-инъекции: Используйте параметризованные запросы или ORM (например, Entity Framework).
using (SqlCommand cmd = new SqlCommand("SELECT * FROM Users WHERE Username = @username", conn))
{
cmd.Parameters.AddWithValue("@username", username);
// Выполнение команды
}
XSS: Используйте библиотеку для экранирования HTML, например, AntiXSS.
string safeContent = Microsoft.Security.Application.Encoder.HtmlEncode(userInput);
🟠Использование Аутентификации и Авторизации
Обеспечьте надежную аутентификацию и разграничение доступа к ресурсам.
Аутентификация: Используйте современные методы аутентификации, такие как OAuth, OpenID Connect.
Авторизация: Применяйте ролевую или заявочную (claims-based) авторизацию.
[Authorize(Roles = "Admin")]
public IActionResult AdminOnly()
{
return View();
}
🟠Защита от CSRF (Межсайтовая подделка запросов)
Используйте анти-CSRF токены для защиты от CSRF атак.
<form asp-action="Create">
<input type="hidden" name="__RequestVerificationToken" value="@Antiforgery.GetTokens(HttpContext).RequestToken" />
<!-- Другие поля формы -->
</form>
🟠Шифрование и Защита Данных
Шифруйте чувствительные данные как при передаче, так и при хранении.
При передаче: Используйте HTTPS для шифрования данных, передаваемых через сеть.
При хранении: Используйте библиотеки для шифрования, такие как System.Security.Cryptography.
using (Aes aes = Aes.Create())
{
aes.Key = key;
aes.IV = iv;
// Шифрование данных
}
🟠Логирование и Мониторинг
Внедрите логирование и мониторинг для обнаружения и анализа подозрительной активности.
Логирование: Логируйте важные действия, такие как входы в систему, изменения данных.
Мониторинг: Используйте инструменты мониторинга, такие как Application Insights, для отслеживания состояния приложения.
_logger.LogInformation("User {UserId} logged in.", userId);
🟠Управление Ошибками и Исключениями
Не показывайте подробные сообщения об ошибках пользователям, чтобы не раскрывать внутреннюю структуру приложения.
Обработка исключений: Ловите и корректно обрабатывайте исключения, предоставляя пользователю дружелюбные сообщения.
try
{
// Код, который может вызвать исключение
}
catch (Exception ex)
{
_logger.LogError(ex, "Произошла ошибка.");
return View("Error");
}
🟠Обновления и Патчи
Регулярно обновляйте используемые библиотеки и фреймворки, чтобы закрывать уязвимости.
🟠Минимизация Поверхности Атаки
Удалите или отключите ненужные функции и сервисы, чтобы минимизировать возможные точки входа для атак.
🟠Защита Конфигурации
Защитите конфигурационные файлы, содержащие чувствительную информацию.
Секреты и ключи: Используйте секреты и безопасное хранилище для конфиденциальной информации.
var connectionString = Configuration["ConnectionStrings:DefaultConnection"];
Ставь 👍 и забирай 📚 Базу знаний5 049
CodHub теперь в Telegram!
Бесплатные обучающие материалы, которые лучше платных — книги, ресурсы, статьи и курсы топовых вузов страны тут:
👩💻 Материалы по Python
👩💻 Материалы по Frontend
👩💻 Материалы по Java
👩💻 Материалы по С#
👩💻 Материалы по C/C++
👩💻 Материалы по Хакингу
🖥 Материалы по SQL
👩💻 Материалы по Kotlin/Swift
👩💻 Материалы по Linux
🐞 Материалы по QA
👩💻 Материалы по Go
👩💻 Материалы по PHP
Подписываетесь: @CodHub_tg
5 049
🤔 Зачем может понадобиться делать свой exception?
Создание своих исключений в C# может понадобиться в ряде случаев, когда стандартные исключения не подходят для описания специфических ошибок, возникающих в вашем приложении.
🟠Специфичность и Контекст
Свои исключения позволяют дать более точное описание ошибки, связанной с конкретной бизнес-логикой или контекстом приложения. Это делает код более понятным и легким для сопровождения.
public class InsufficientFundsException : Exception
{
public InsufficientFundsException(string message) : base(message) { }
}
public class BankAccount
{
public void Withdraw(decimal amount)
{
if (amount > Balance)
{
throw new InsufficientFundsException("Недостаточно средств на счете.");
}
// Логика снятия средств
}
}
🟠Улучшение Отладки и Логирования
Свои исключения могут включать дополнительную информацию, которая поможет лучше понять контекст ошибки при отладке или логировании.
public class DataNotFoundException : Exception
{
public string DataId { get; }
public DataNotFoundException(string dataId, string message) : base(message)
{
DataId = dataId;
}
}
void GetData(string id)
{
// Если данные не найдены
throw new DataNotFoundException(id, "Данные не найдены для ID: " + id);
}
🟠Группировка Исключений
Создание своих исключений позволяет логически группировать ошибки, что облегчает их обработку в коде. Например, можно создать базовое исключение для всех ошибок, связанных с доступом к базе данных, и наследовать от него конкретные типы ошибок.
public class DatabaseException : Exception
{
public DatabaseException(string message) : base(message) { }
}
public class RecordNotFoundException : DatabaseException
{
public RecordNotFoundException(string message) : base(message) { }
}
public class ConnectionFailedException : DatabaseException
{
public ConnectionFailedException(string message) : base(message) { }
}
🟠Соответствие Архитектуре
В сложных системах с многоуровневой архитектурой свои исключения помогают управлять ошибками на каждом уровне, передавая их на более высокий уровень для централизованной обработки.
public class BusinessException : Exception
{
public BusinessException(string message) : base(message) { }
}
public class PaymentProcessingException : BusinessException
{
public PaymentProcessingException(string message) : base(message) { }
}
void ProcessPayment()
{
try
{
// Логика обработки платежа
}
catch (Exception ex)
{
throw new PaymentProcessingException("Ошибка при обработке платежа: " + ex.Message);
}
}
🟠Обеспечение Лучшего Взаимодействия с Пользователем
Пользовательские исключения могут содержать информацию, которая будет полезна для отображения пользователю, улучшая пользовательский опыт.
public class UserNotAuthorizedException : Exception
{
public UserNotAuthorizedException(string message) : base(message) { }
}
void AccessRestrictedArea()
{
if (!userIsAuthorized)
{
throw new UserNotAuthorizedException("Пользователь не имеет права доступа к этому разделу.");
}
// Логика доступа
}
Ставь 👍 и забирай 📚 Базу знаний5 049
🤔 Почему лучше использовать ExceptionX обычный?
Использование специализированных исключений, таких как
ArgumentException, InvalidOperationException, или пользовательских исключений (например, MyCustomException), лучше, чем использование общего исключения Exception. Это позволяет более точно и детально управлять ошибками.
🚩Почему это важно:
🟠Уточнение причины ошибки
Специализированные исключения помогают точнее определить, что именно пошло не так. Например, ArgumentNullException ясно указывает, что переданный аргумент был null, в то время как Exception может означать любую ошибку.
void ProcessData(string data)
{
if (data == null)
{
throw new ArgumentNullException(nameof(data), "Data cannot be null");
}
// Обработка данных
}
🟠Улучшение читаемости кода
Использование конкретных исключений делает код более читаемым и поддерживаемым. Разработчики, читающие код, сразу понимают, какие именно ошибки могут возникнуть и как с ними справляться.
try
{
// Код, который может вызвать исключение
}
catch (ArgumentNullException ex)
{
// Обработка ситуации, когда аргумент был null
}
catch (InvalidOperationException ex)
{
// Обработка некорректного состояния операции
}
🟠Улучшение отладки
Специализированные исключения предоставляют больше информации для отладки. Это позволяет быстрее найти и исправить ошибки, так как разработчики получают более точные сообщения об ошибках.
try
{
// Код, который может вызвать исключение
}
catch (Exception ex)
{
// Общее исключение, трудно определить причину
Console.WriteLine("Произошла ошибка: " + ex.Message);
}
🟠Гранулированная обработка исключений
С помощью специализированных исключений можно различать разные типы ошибок и применять к ним разные стратегии обработки. Это делает обработку ошибок более гибкой и точной.
try
{
// Код, который может вызвать исключение
}
catch (ArgumentNullException ex)
{
Console.WriteLine("Обязательный аргумент не был передан: " + ex.Message);
// Специфическая обработка для отсутствующего аргумента
}
catch (ArgumentException ex)
{
Console.WriteLine("Аргумент некорректен: " + ex.Message);
// Специфическая обработка для некорректного аргумента
}
🟠Создание пользовательских исключений
В сложных приложениях можно создавать пользовательские исключения, которые более точно описывают уникальные ошибки, специфичные для вашего приложения.
public class MyCustomException : Exception
{
public MyCustomException(string message) : base(message) { }
}
void DoSomething()
{
throw new MyCustomException("Произошла специфическая ошибка.");
}
Ставь 👍 и забирай 📚 Базу знаний5 049
🤔 Как реализовать обработку исключений
Обработка исключений в C# необходима для правильного управления ошибками, возникающими во время выполнения программы. Она позволяет перехватывать ошибки и выполнять соответствующие действия, чтобы программа не завершалась аварийно. Рассмотрим основные конструкции для обработки исключений:
try, catch, finally, и throw.
Конструкция try-catch
Конструкция try-catch используется для перехвата и обработки исключений. Код, который может вызвать исключение, помещается в блок try, а код для обработки исключения - в блок catch.
try
{
// Код, который может вызвать исключение
int result = 10 / 0;
}
catch (DivideByZeroException ex)
{
// Обработка исключения
Console.WriteLine("Произошло деление на ноль: " + ex.Message);
}
catch (Exception ex)
{
// Обработка других исключений
Console.WriteLine("Произошла ошибка: " + ex.Message);
}
Конструкция finally
Блок finally выполняется в любом случае после завершения блоков try и catch, независимо от того, возникло исключение или нет. Он часто используется для освобождения ресурсов, таких как файловые дескрипторы или сетевые подключения.
try
{
// Код, который может вызвать исключение
using (StreamReader sr = new StreamReader("file.txt"))
{
// Чтение файла
}
}
catch (FileNotFoundException ex)
{
// Обработка исключения
Console.WriteLine("Файл не найден: " + ex.Message);
}
finally
{
// Очистка ресурсов
Console.WriteLine("Закрытие файла.");
}
Генерация исключений с помощью throw
Ключевое слово throw используется для генерации исключений. Оно может быть использовано как для передачи возникшего исключения дальше по цепочке вызовов, так и для создания нового исключения.
void ProcessNumber(int number)
{
if (number < 0)
{
throw new ArgumentOutOfRangeException("number", "Число должно быть неотрицательным");
}
// Продолжение обработки
}
Вложенные и повторные исключения
Вложенные исключения позволяют захватывать одно исключение и генерировать новое, сохраняя информацию о первоначальном исключении.
try
{
// Код, который может вызвать исключение
MethodThatThrows();
}
catch (Exception ex)
{
throw new InvalidOperationException("Ошибка в процессе выполнения", ex);
}
Ставь 👍 и забирай 📚 Базу знаний5 049
👩💻 Программирование уже в Telegram!
Вот 10 обучающих каналов по самым востребованным направлениям в IT.
Выбирай своё направление:
👩💻 Python: @python_ready
👩💻 Java: @java_ready
👩💻 C/C++: @cpp_ready
👩💻 C#: @csharp_ready
👩💻 Backend: @backend_ready
👩💻 Frontend: @code_ready
🖥 Базы Данных & SQL: @sql_ready
👩💻 Весь IT: @roadmap_ready
📖 IT Архив: @archive_ready
🖥 Design: @time_design
📌 Ресурсы, гайды, шпаргалки, книги и задачи для каждого языка программирования.
متاح الآن! بحث تيليغرام 2025 — أهم رؤى العام 
