C# | Вопросы собесов
Відкрити в Telegram
Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @sendme_ads
Показати більше5 002
Підписники
+324 години
-37 днів
-830 днів
Архів дописів
5 002
Всё для уверенной улыбки от Oral-B
✅ Совершенная технология Oral-B iO в ассортименте Oral-B
✅ Беспощадна к налёту, нежная к дёснам
Купить
#реклама
market.yandex.ru
О рекламодателе
5 002
🤔 Какие принципы и практики используешь для обеспечения безопасности приложений?
🟠Валидация и Санитизация Входных Данных
Валидация входных данных помогает предотвратить атаки, такие как 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 002
🔴 Открытое собеседование на Middle C# | 10 ноября, 19:00 мск
Senior C# разработчик проведёт техническое интервью в прямом эфире. Посмотришь, как всё устроено изнутри, какие задания предлагают кандидатам и насколько ты готов к такому формату.
Как всё будет проходить:
📂 Интервьюер: Александр Моргунов, Senior C# разработчик с опытом 7+ лет в европейских высоконагруженных сервисах. В роли кандидата - разработчик-доброволец.
📂 Никакого сценария: Александр задаст вопросы и предложит задачи, которые использует на технических интервью. Кандидат заранее их не знает.
📂 В конце Александр пообщается со зрителями и ответит на их вопросы
Участие бесплатное!
Эфир проходит в рамках менторской программы ШОРТКАТ для разработчиков, которые хотят сменить работу, вырасти в грейде и зарплате или прокачать технические навыки
Переходи в бота, чтобы получить ссылку на эфир → @shortcut_csharp_bot
Реклама.
О рекламодателе.
5 002
🤔 Когда можно использовать using?
using используется для управления объектами, реализующими интерфейс IDisposable, чтобы гарантировать освобождение ресурсов. Это удобно для работы с файлами, потоками, базами данных и другими ресурсами, требующими явного закрытия. Код внутри блока using автоматически вызывает метод Dispose для объекта, даже если возникло исключение.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 002
🤔 Что такое IQueryable?
Это интерфейс, который наследуется от
IEnumerable и предоставляет функциональность для оценки запросов к источнику данных. Основное отличие IQueryable от IEnumerable заключается в том, что IQueryable позволяет запросы быть построенными и выполненными отложенно на стороне источника данных, такого как база данных. Это обеспечивает большую эффективность, поскольку именно необходимые данные извлекаются и передаются, вместо извлечения всего объема данных и их фильтрации на стороне клиента.
🚩Как работает IQueryable
Использует LINQ-провайдеры, которые транслируют выражения LINQ в запросы, специфичные для источника данных (например, SQL для баз данных). Это позволяет делать запросы более оптимальными, так как они обрабатываются средствами самого источника данных.
🟠Отложенное выполнение (Deferred Execution)
Запросы IQueryable не выполняются, пока не будут перечислены. Это позволяет системе строить более сложные запросы перед их выполнением.
🟠Составление запросов
Вы можете построить запрос по частям, добавляя условия на каждом шаге. Финальный запрос выполняется только при перечислении результатов, что позволяет избежать ненужной нагрузки на источник данных.
🟠Преобразование запросов
LINQ-провайдеры могут преобразовать выражения запросов IQueryable в оптимизированные запросы к базе данных или другим источникам, что позволяет выполнять сложные операции на стороне сервера, такие как сортировка, группировка и агрегирование.
using (var context = new MyDbContext()) // MyDbContext — это контекст Entity Framework
{
IQueryable<Product> query = context.Products.Where(p => p.Price > 100);
// Запрос еще не выполнен, можно добавить другие условия
query = query.OrderBy(p => p.Name);
// Запрос выполняется только при перечислении
foreach (var product in query)
{
Console.WriteLine($"{product.Name}: {product.Price}");
}
}
Ставь 👍 и забирай 📚 Базу знаний5 002
Бесплатные онлайн-лекции по ИТ и биотеху: 6—17 ноября
Что меняется с развитием ИИ в ИТ-сфере? Расскажут эксперты — представители науки и индустрии на открытых лекциях магистратуры Центрального университета.
6—17 ноября онлайн.
Для тех, кто строит карьеру в ИТ!
Зарегистрироваться
#реклама 16+
cu.ru
О рекламодателе
5 002
🤔 Что такое try-catch?
try-catch — это механизм обработки исключений в C#.
Код, который может вызвать ошибку во время выполнения, помещается в блок try.
Если ошибка происходит, выполнение переходит в соответствующий блок catch.
Блок finally может использоваться для выполнения завершающих действий, выполняемых независимо от ошибок (например, закрытие файлов, соединений и т.д.).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 002
🤔 Что такое делегаты и зачем они нужны?
Делегаты — это типы, которые безопасно инкапсулируют методы, подобно указателям на функции в других языках программирования, но с проверкой типов во время компиляции. Могут ссылаться на метод, который принимает параметры и возвращает значение. Они используются для реализации обратных вызовов и событий, а также для определения пользовательских операций, которые могут быть выполнены методом, принимаемым в качестве параметра.
🚩Зачем они нужны?
🟠Обратные вызовы (Callbacks)
Делегаты предоставляют механизм для передачи методов в качестве аргументов другим методам. Это полезно для реализации обратных вызовов, позволяя вызывать методы в ответ на определенные события или условия.
🟠События
Являются основой системы событий. Они позволяют определять события и подписываться на них. Когда событие происходит, вызываются делегаты, связанные с этим событием, что позволяет реагировать на изменения или действия пользователя.
🟠Параметризация методами
Позволяют создавать более гибкие и масштабируемые приложения, поскольку методы могут быть переданы и использованы динамически в различных контекстах.
🟠Асинхронное программирование
Используются для асинхронного программирования, позволяя выполнять задачи в фоновом режиме, не блокируя основной поток приложения.
public delegate int Operation(int x, int y);
public class Calculator
{
public int PerformOperation(int x, int y, Operation op)
{
return op(x, y);
}
}
class Program
{
static int Add(int x, int y)
{
return x + y;
}
static int Multiply(int x, int y)
{
return x * y;
}
static void Main()
{
Calculator calc = new Calculator();
// Создание делегата для метода Add и вызов через метод PerformOperation
Operation addOp = new Operation(Add);
int result = calc.PerformOperation(5, 6, addOp);
Console.WriteLine("Addition: " + result);
// Создание делегата для метода Multiply и вызов через метод PerformOperation
Operation mulOp = new Operation(Multiply);
result = calc.PerformOperation(5, 6, mulOp);
Console.WriteLine("Multiplication: " + result);
}
}
Ставь 👍 и забирай 📚 Базу знаний5 002
Нейросети сбежали из лаборатории. Лови!
Claude, GPT, Grok, Gemini, Muse, GLM, Qwen: о них слышно со всех сторон, и у каждой своя суперсила. Как попробовать всех, сравнить и запрячь в реальную работу? В D'Lemma они живут в одном чате: меняй нейросеть прямо в беседе, история остается общей.
Изображения. Nano Banana, GPT Image и другие - рисуют по описанию в любом стиле: акварель, зарисовка, фото. Загрузи свое фото, и они отретушируют его, сменят фон или примерят образ по образцу.
Музыка. Suno и Fuzz сочиняют и поют: поздравление с именем, трек для ролика, песня на твои стихи. Просто расскажи, о чем петь.
А еще пойманные нейросети соберут презентацию или документ готовым файлом. Оплата в рублях, один баланс на всех.
Поймай их всех! Попробуй D'Lemma
Узнать больше
#реклама 16+
dlemma.tech
О рекламодателе
5 002
🤔 В чем отличие монолитной и микросервисной архитектуры на практике?
1. Монолит: весь код в одном приложении; легче разрабатывать и развертывать, но сложнее масштабировать и обновлять.
2. Микросервисы: система состоит из небольших сервисов, каждый из которых работает независимо; проще масштабировать и изменять, но сложнее управлять взаимодействиями.
3. На практике микросервисы требуют продвинутой инфраструктуры и мониторинга.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 002
🤔 Какие есть способы (протоколы) обмена данными между сервером и клиентом?
При взаимодействии клиента и сервера используются различные*протоколы обмена данными, в зависимости от задачи, скорости, надежности и реального времени.
🚩HTTP(S) – стандартный протокол веба
Клиент (браузер, мобильное приложение) делает запрос к серверу.
Сервер отправляет ответ с данными (HTML, JSON, XML).
Использует методы:
GET, POST, PUT, DELETE и т. д.
fetch('https://api.example.com/data')
.then(response => response.json())
.then(data => console.log(data));
🚩WebSocket – двусторонняя связь в реальном времени
Клиент устанавливает постоянное соединение с сервером.
Сервер и клиент могут отправлять друг другу данные в любое время.
Используется для чата, онлайн-игр, бирж, обновлений в реальном времени.
const socket = new WebSocket('wss://example.com/socket');
socket.onopen = () => socket.send('Привет, сервер!');
socket.onmessage = event => console.log('Сообщение от сервера:', event.data);
🚩SSE (Server-Sent Events) – поток данных от сервера
Клиент делает HTTP-запрос, но соединение не закрывается.
Сервер постепенно отправляет данные в виде событий (event-stream).
Используется для новостей, биржевых данных, уведомлений.
const eventSource = new EventSource('/events');
eventSource.onmessage = event => console.log('Новое сообщение:', event.data);
🚩gRPC – быстрый RPC поверх HTTP/2
Клиент вызывает удаленные методы напрямую как обычные функции.
Работает на HTTP/2, использует бинарный формат Protocol Buffers (быстрее, чем JSON).
Используется для высокопроизводительных API, микросервисов.
import grpc
import my_service_pb2
import my_service_pb2_grpc
channel = grpc.insecure_channel('localhost:50051')
stub = my_service_pb2_grpc.MyServiceStub(channel)
response = stub.MyMethod(my_service_pb2.MyRequest(name="Alice"))
print(response.message)
🚩MQTT – лёгкий протокол для IoT
Работает по модели издатель/подписчик.
Клиент подписывается на тему (topic) и получает сообщения, когда кто-то публикует данные.
Используется для умных устройств, датчиков, IoT.
const mqtt = require('mqtt');
const client = mqtt.connect('mqtt://broker.hivemq.com');
client.on('connect', () => {
client.subscribe('myTopic');
client.publish('myTopic', 'Привет, MQTT!');
});
client.on('message', (topic, message) => {
console.log(`Сообщение из ${topic}: ${message.toString()}`);
});
Ставь 👍 и забирай 📚 Базу знаний5 002
🤔 Что такое deadlock?
Deadlock — это ситуация, когда два или более потока заблокированы, каждый из них ждёт ресурс, занятый другим, и в результате никто не может продолжить работу. Система зацикливается и зависает. Такое часто происходит при неправильной последовательности захвата ресурсов.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 002
🤔 Как сделать связь один к одному?
В реляционных базах данных связь "один к одному" (one-to-one) подразумевает, что каждая запись в одной таблице соответствует ровно одной записи в другой таблице. Для реализации связи "один к одному" в SQL можно использовать несколько подходов, в зависимости от требований и архитектуры базы данных.
🚩Основные подходы
🟠Уникальные внешние ключи
Используйте внешний ключ в одной таблице, который ссылается на первичный ключ другой таблицы, и сделайте этот внешний ключ уникальным.
🟠Одинаковые первичные ключи
Используйте один и тот же первичный ключ в обеих таблицах, где одна таблица содержит внешний ключ, который является также первичным ключом.
🚩Уникальные внешние ключи
Таблицы
Users (пользователи)
UserId (Primary Key)
UserName
Profiles (профили)
ProfileId (Primary Key)
UserId (Foreign Key, Unique)
ProfileData
Создание таблиц
CREATE TABLE Users (
UserId INT PRIMARY KEY,
UserName VARCHAR(100)
);
CREATE TABLE Profiles (
ProfileId INT PRIMARY KEY,
UserId INT UNIQUE,
ProfileData VARCHAR(255),
FOREIGN KEY (UserId) REFERENCES Users(UserId)
);
Вставка данных
INSERT INTO Users (UserId, UserName) VALUES (1, 'John Doe');
INSERT INTO Profiles (ProfileId, UserId, ProfileData) VALUES (1, 1, 'Profile data for John Doe');
Запрос данных
SELECT Users.UserName, Profiles.ProfileData
FROM Users
JOIN Profiles ON Users.UserId = Profiles.UserId;
🚩Одинаковые первичные ключи
Таблицы
Users (пользователи)
UserId (Primary Key)
UserName
Profiles (профили)
UserId (Primary Key, Foreign Key)
ProfileData
Создание таблиц
CREATE TABLE Users (
UserId INT PRIMARY KEY,
UserName VARCHAR(100)
);
CREATE TABLE Profiles (
UserId INT PRIMARY KEY,
ProfileData VARCHAR(255),
FOREIGN KEY (UserId) REFERENCES Users(UserId)
);
Вставка данных
INSERT INTO Users (UserId, UserName) VALUES (1, 'John Doe');
INSERT INTO Profiles (UserId, ProfileData) VALUES (1, 'Profile data for John Doe');
Запрос данных
SELECT Users.UserName, Profiles.ProfileData
FROM Users
JOIN Profiles ON Users.UserId = Profiles.UserId;
🚩Плюсы и минусы
🟠Уникальные внешние ключи
➕Четкая семантика внешнего ключа.
➕Легкость добавления дополнительных данных в связанную таблицу.
➖Необходимо следить за уникальностью внешнего ключа.
🟠Одинаковые первичные ключи
➕Единый идентификатор для связанных данных.
➕Простота конструкции при обеспечении связи.
➖Необходимость синхронизации идентификаторов в обеих таблицах.
Ставь 👍 и забирай 📚 Базу знаний5 002
Ищем работу в IT за тебя
OfferMate подбирает IT-вакансии на hh.ru, отправляет отклики и пишет сопроводительные письма. Отвечает рекрутерам, решает тесты при отклике и готовит резюме под нужную роль. Посмотри, как работает сервис.
Узнать больше
#реклама 16+
offermate.ru
О рекламодателе
5 002
🤔 Сравнение паттернов Adapter и Decorator
1. Adapter: преобразует интерфейс одного класса в интерфейс, который ожидает клиент; используется для интеграции несовместимых компонентов.
2. Decorator: добавляет новую функциональность существующему объекту без изменения его структуры.
3. Adapter изменяет совместимость, а Decorator — поведение объекта.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 002
🤔 Что такое предикат?
Это делегат, представляющий метод, который принимает один или несколько аргументов и возвращает логическое значение (
true или false). Предикаты часто используются для фильтрации коллекций, поиска элементов и других операций, связанных с условными проверками.
🚩Особенности
🟠Тип делегата
В C# предикат представлен делегатом Predicate<T>, который принимает один аргумент типа T и возвращает bool.
🟠Использование
Предикаты обычно используются в методах стандартных коллекций, таких как List<T>, для поиска, удаления и фильтрации элементов.
🚩Пример использования предиката
Определение предиката
public static bool IsEven(int number)
{
return number % 2 == 0;
}
Использование предиката с методом коллекции
using System;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6 };
// Использование предиката для поиска первого четного числа
int firstEven = numbers.Find(IsEven);
Console.WriteLine("First even number: " + firstEven);
// Использование предиката для удаления всех четных чисел
numbers.RemoveAll(IsEven);
Console.WriteLine("Numbers after removing evens: " + string.Join(", ", numbers));
}
public static bool IsEven(int number)
{
return number % 2 == 0;
}
}
🚩Лямбда-выражения как предикаты
Лямбда-выражения часто используются для определения предикатов непосредственно в месте вызова метода. Это делает код более компактным и удобочитаемым.
Пример использования лямбда-выражений
using System;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6 };
// Использование лямбда-выражения для поиска первого четного числа
int firstEven = numbers.Find(n => n % 2 == 0);
Console.WriteLine("First even number: " + firstEven);
// Использование лямбда-выражения для удаления всех четных чисел
numbers.RemoveAll(n => n % 2 == 0);
Console.WriteLine("Numbers after removing evens: " + string.Join(", ", numbers));
}
}
🚩Сценарии использования предикатов
🟠Фильтрация коллекций
Предикаты используются для определения условий фильтрации элементов в коллекциях.
List<int> evenNumbers = numbers.FindAll(IsEven);
🟠Поиск элементов
Предикаты помогают находить элементы, соответствующие определенному условию.
int firstEven = numbers.Find(IsEven);
🟠Удаление элементов
Предикаты используются для удаления элементов, соответствующих определенному условию.
numbers.RemoveAll(IsEven);
Ставь 👍 и забирай 📚 Базу знаний5 002
🔥 Скрытые вакансии с удаленной работой для C# разработчика, которые нигде больше не публикуются. Напрямую от компаний, с контактами рекрутеров.
🔹 C# .NET Jobs | Вакансии
🔹 Unity Jobs | Вакансии
🔸 Все каналы с вакансиями
5 002
Монолит vs микросервисы: битва за ваши нервы
💻 Монолит или микросервисы? Кажется, что ответ очевиден, но почему-то одни проекты летают, а другие тонут в хаосе?
Присоединяйтесь к открытому уроку Сергея Прощаева и получите пошаговое руководство по выбору архитектуры.
📅 9 ноября в 20:00. Разберём:
- Как не попасть в ловушку «модных» микросервисов.
- Признаки, что пора выходить из монолита.
- Архитектурные паттерны перехода: Strangler Fig, BFF, Self-contained systems.
- Организационные и технические риски — что пойдёт не так.
- Роль DevOps, CI/CD и мониторинга.
Вы научитесь оценивать реальные риски и стоимость микросервисов, внедрять изменения без сбоев и хаоса и принимать взвешенные решения, сохраняя технический контроль и производительность команды.
✅ Запишитесь сейчас!
Узнать больше
#реклама 16+
otus.ru
О рекламодателе
5 002
🤔 В чём разница между SOAP и REST?
SOAP — это строго определённый протокол обмена сообщениями, обычно использующий XML и WSDL, с формальной спецификацией. Он более тяжеловесный, ориентирован на стандартизацию и включает такие функции, как безопасность, транзакции, надёжная доставка.
REST — это архитектурный стиль, работающий поверх HTTP, ориентированный на ресурсы. Он проще, легче по синтаксису (часто использует JSON), хорошо подходит для веб-приложений и микросервисов. REST ближе к вебу, тогда как SOAP больше используется в корпоративных системах.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 002
🤔 Про абстрактные классы, интерфейсы и в чем их разница и особенности?
В C# абстрактные классы и интерфейсы используются для проектирования системы через наследование и полиморфизм, позволяя описывать общую функциональность, которую будут реализовывать конкретные классы. Однако у них есть свои особенности, ограничения и сферы применения.
🚩Абстрактный класс
Абстрактный класс — это класс, который не может быть создан напрямую (нельзя создать объект этого класса). Он может содержать как абстрактные методы (без реализации), так и методы с реализацией.
public abstract class Animal
{
public abstract void MakeSound(); // Абстрактный метод
public void Sleep() // Метод с реализацией
{
Console.WriteLine("Sleeping...");
}
}
Пример
public class Dog : Animal
{
public override void MakeSound()
{
Console.WriteLine("Bark!");
}
}
Использование
Animal myDog = new Dog();
myDog.MakeSound(); // Вывод: Bark!
myDog.Sleep(); // Вывод: Sleeping...
🚩Интерфейс
Интерфейс — это контракт, который определяет только сигнатуры методов, свойств, событий и индексаторов. Реализацию этих членов должен предоставить класс, который реализует интерфейс.
public interface IMovable
{
void Move();
int Speed { get; set; }
}
Пример
public class Car : IMovable
{
public int Speed { get; set; }
public void Move()
{
Console.WriteLine($"Moving at speed: {Speed}");
}
}
Использование
IMovable myCar = new Car { Speed = 60 };
myCar.Move(); // Вывод: Moving at speed: 60
Ставь 👍 и забирай 📚 Базу знаний