C# | Вопросы собесов
Открыть в Telegram
Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @easyoffer_adv
Больше5 033
Подписчики
Нет данных24 часа
-167 дней
-3530 день
Архив постов
5 033
🤔 Что значит, что система является RESTful?
Это система, реализующая архитектурный стиль REST (Representational State Transfer). Это означает:
- Используются HTTP-методы как команды (GET, POST, PUT, DELETE).
- Ресурсы имеют уникальные URI.
- Коммуникация без состояния (stateless).
- Возможна кэшируемость.
- Данные передаются в виде представлений ресурса (обычно JSON/XML).ксте онлайн
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 033
📺 Уникальная база IT собеседований
456+ реальных собеседований на программиста, тестировщика, аналитика и прочие IT профы.
Есть собесы от ведущих компаний: Сбер, Яндекс, ВТБ, Тинькофф, Озон, Wildberries и т.д.
🎯 Переходи по ссылке и присоединяйся к базе, чтобы прокачать свои шансы на успешное трудоустройство!
5 033
🤔 В каком случае использовать интерфейс, в каком абстрактный класс?
Выбор между интерфейсом и абстрактным классом в C# зависит от нескольких факторов, таких как потребности в наследовании, степень общности, возможность множественного наследования и необходимость реализации по умолчанию.
🚩Когда использовать интерфейсы
🟠Множественное наследование
Класс может реализовывать несколько интерфейсов, но наследоваться только от одного класса. Используйте интерфейсы, когда требуется множественное наследование.
public interface IDriveable
{
void Drive();
}
public interface IFlyable
{
void Fly();
}
public class FlyingCar : IDriveable, IFlyable
{
public void Drive() { /* Реализация вождения */ }
public void Fly() { /* Реализация полета */ }
}
🟠Общее поведение без реализации
Используйте интерфейсы, чтобы определить общий набор методов и свойств без предоставления какой-либо реализации. Это позволяет разным классам реализовать интерфейс по-своему.
public interface IShape
{
double GetArea();
}
public class Circle : IShape
{
public double Radius { get; set; }
public double GetArea() => Math.PI * Radius * Radius;
}
public class Rectangle : IShape
{
public double Width { get; set; }
public double Height { get; set; }
public double GetArea() => Width * Height;
}
🟠Гибкость и полиморфизм
Интерфейсы позволяют легко менять реализацию и обеспечивают гибкость в коде. Можно использовать интерфейсы для создания полиморфных коллекций или методов, которые работают с разными реализациями интерфейсов.
public void DrawShapes(IEnumerable<IShape> shapes)
{
foreach (var shape in shapes)
{
Console.WriteLine($"Area: {shape.GetArea()}");
}
}
🚩Когда использовать
🟠Частичная реализация
Используйте абстрактные классы, если вы хотите предоставить некоторую общую реализацию, которую могут использовать подклассы. Абстрактные классы могут содержать как абстрактные, так и не абстрактные методы.
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");
}
🟠Шаблонный метод
Абстрактные классы хорошо подходят для реализации паттерна "Шаблонный метод", где общий алгоритм реализован в абстрактном классе, а конкретные шаги определены в подклассах.
public abstract class Game
{
public void Play()
{
Initialize();
StartPlay();
EndPlay();
}
protected abstract void Initialize();
protected abstract void StartPlay();
protected abstract void EndPlay();
}
public class Football : Game
{
protected override void Initialize() => Console.WriteLine("Football Game Initialized");
protected override void StartPlay() => Console.WriteLine("Football Game Started");
protected override void EndPlay() => Console.WriteLine("Football Game Ended");
}
Ставь 👍 и забирай 📚 Базу знаний5 033
🤔 Есть ли какие-то ограничения для типов данных по ключу?
Да:
- Ключ не должен быть null (в Dictionary).
- Ключ должен быть неизменяемым, т.е. после помещения в словарь не должен меняться его хеш или логическое состояние.
- Должен корректно реализовывать Equals() и GetHashCode(), иначе возможны ошибки поиска или дубликаты.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 033
🤔 Про абстрактные классы, интерфейсы и в чем их разница и особенности?
В 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
Ставь 👍 и забирай 📚 Базу знаний5 033
🤔 Как компилятор понимает, какой результат возвращать?
Компилятор определяет тип возвращаемого значения на основе сигнатуры метода и контекста его вызова.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 033
🤔 Что такое аутентификация?
Когда человек вводит логин и пароль, система аутентифицирует его, проверяя, действительно ли это тот, за кого он себя выдаёт.
🚩Как работает аутентификация?
Пользователь вводит данные (например, логин и пароль).
Система проверяет их в базе данных.
Если данные верны → доступ разрешён.
Если данные неверны → отказ в доступе.
public async Task<IActionResult> Login(string username, string password)
{
var user = await _userManager.FindByNameAsync(username);
if (user != null && await _userManager.CheckPasswordAsync(user, password))
{
await _signInManager.SignInAsync(user, isPersistent: false);
return RedirectToAction("Index", "Home");
}
ModelState.AddModelError("", "Неверный логин или пароль");
return View();
}
🚩Виды аутентификации
🟠По паролю
Самый распространённый вариант. Минус: если пароль украден – доступ открыт.
🟠Двухфакторная (2FA)
Например, SMS-код + пароль. Усложняет взлом аккаунта.
🟠Биометрическая
Отпечаток пальца, Face ID. Удобно, но требует спецоборудования.
🟠OAuth (Google, Facebook, GitHub)
Вход через соцсети. Удобно, не нужно запоминать пароль.
🟠Аутентификация по токену (JWT)
Используется в API и микросервисах. Позволяет работать без сохранения сессий.
Ставь 👍 и забирай 📚 Базу знаний5 033
🤔 Что такое стек?
Стек — это структура данных LIFO, где последний добавленный элемент извлекается первым, используется для вызовов функций и локальных переменных.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 033
🤔 Что такое контекст синхронизации?
"контекст синхронизации" (SynchronizationContext) — это класс, который предоставляет возможность управлять способом, которым операции переключаются обратно в основной поток или контекст для продолжения выполнения после асинхронной операции. Это важно для приложений с графическим пользовательским интерфейсом, таких как Windows Forms и WPF, где доступ к элементам пользовательского интерфейса разрешён только из основного потока.
🚩Как он работает
Абстрагирует модель синхронизации для различных сред выполнения. Например, в приложениях Windows Forms и WPF управление элементами UI должно происходить в главном потоке.
SynchronizationContext предоставляет методы для отправки (Send) и постановки (Post) задач, которые должны выполняться в правильном контексте.
🟠Send
синхронно отправляет делегат на выполнение в контекст синхронизации.
🟠Post
асинхронно отправляет делегат на выполнение в контекст синхронизации.
🚩Применение SynchronizationContext
Используется для того, чтобы после асинхронной операции вернуться в правильный поток и безопасно обновить UI или выполнить код, который требует выполнения в определённом потоке.
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
LoadDataAsync();
}
private async void LoadDataAsync()
{
string data = await GetDataAsync();
// Асинхронно получаем данные и обновляем UI
Dispatcher.Invoke(() => DisplayData(data));
}
private Task<string> GetDataAsync()
{
return Task.Run(() =>
{
// Имитация долгой операции
Thread.Sleep(5000);
return "Data loaded";
});
}
private void DisplayData(string data)
{
MyTextBox.Text = data;
}
}
🚩Зачем он нужен
🟠Безопасность потоков
Позволяет безопасно обращаться к элементам UI из асинхронных или вторичных потоков.
🟠Правильное управление потоками
Обеспечивает выполнение кода в контексте, для которого он предназначен, что особенно важно в многопоточных и сетевых приложениях.
Ставь 👍 и забирай 📚 Базу знаний5 033
Распродажа внедорожников HAVAL. Выгода до 850 000 ₽
Купить новый внедорожник HAVAL проще и дешевле чем вы думаете!
✨Стартовая цена от 2 149 000 ₽ у официального дилера Автопродикс СПб. Действуют рассрочка и кредит на минимальных процентных ставках.✨
Оставьте заявку до 15.05 и закрепите условия:
- Выгода до 850.000 ₽
- Рассрочка на 36 мес.
- КАСКО в подарок
- Зимние шины в подарок
Нажмите "Получить предложение" чтобы узнать стоимость автомобиля и закрепить бонусы:
Получить предложение
Изучите все условия кредита (займа) на сайте в соответствующем разделе. Оценивайте свои финансовые возможности и риски. Финансовые услуги оказывает: ПАО Сбербанк, СПАО "Ингосстрах".
#реклама
autoprodix-havalpro.rqch.ru
О рекламодателе
5 033
🤔 Какая связь между асинхронностью и многопоточностью?
Асинхронность и многопоточность — разные концепции, но они могут пересекаться.
- Многопоточность — параллельное выполнение на нескольких потоках (обычно на разных ядрах процессора).
- Асинхронность — способ не блокировать поток при ожидании завершения операции (например, I/O), не обязательно создавая новый поток.
Асинхронные операции (async/await) чаще всего используют один поток, но освобождают его во время ожидания, позволяя выполнять другую работу.
Многопоточность полезна при расчётах, асинхронность — при ожидании (например, сетевых операций).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 033
🤔 Для чего нужны методы service configuration?
В ASP.NET Core методы Service Configuration используются для настройки и регистрации зависимостей в контейнере внедрения зависимостей (Dependency Injection, DI). Это позволяет управлять зависимостями в приложении, делая код более гибким, тестируемым и удобным для расширения.
🚩Где происходит настройка сервисов?
Настройка сервисов выполняется в методе
ConfigureServices(IServiceCollection services), который находится в классе Program.cs или Startup.cs (в зависимости от версии .NET).
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(); // Добавление контроллеров для API
services.AddDbContext<ApplicationDbContext>(); // Регистрация контекста базы данных
services.AddScoped<IMyService, MyService>(); // Внедрение зависимости
}
🚩Основные виды регистрации сервисов
🟠`AddSingleton<T>`
создаёт единственный экземпляр объекта на всё время работы приложения.
services.AddSingleton<ILogger, ConsoleLogger>();
🟠`AddScoped<T>`
создаёт один экземпляр объекта на каждый HTTP-запрос.
services.AddScoped<IUserService, UserService>();
🟠`AddTransient<T>`
создаёт новый экземпляр объекта при каждом запросе.
services.AddTransient<IEmailSender, EmailSender>();
🚩Пример использования в контроллере
public class HomeController : Controller
{
private readonly IMyService _myService;
public HomeController(IMyService myService)
{
_myService = myService;
}
public IActionResult Index()
{
var data = _myService.GetData();
return View(data);
}
}
Ставь 👍 и забирай 📚 Базу знаний5 033
🤔 Что из себя представляет абстракция?
Это процесс выделения важных характеристик объекта и скрытия несущественных деталей. Она позволяет:
1. Создавать простые интерфейсы для сложных систем.
2. Сосредотачиваться на логике, а не на деталях реализации.
3. Обеспечивать полиморфизм и унифицированный подход к различным объектам.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 033
🤔 В чем суть extension методов?
Extension-методы (методы расширения) — это способ добавить новые методы к существующим классам, не изменяя их код и не создавая наследников. Они позволяют расширять классы и интерфейсы, даже если у нас нет доступа к их исходному коду.
🚩Как работают extension-методы?
Это обычные статические методы, но объявленные внутри статического класса.
Первый параметр метода должен принимать тот тип, который мы хотим расширить, и перед ним ставится ключевое слово
this.
После этого метод становится доступен как "встроенный" у этого типа.
🟠Добавляем метод к `string`
Допустим, у нас есть строка, и мы хотим добавить метод ToSnakeCase, который заменяет пробелы на нижние подчеркивания.
using System;
public static class StringExtensions
{
public static string ToSnakeCase(this string str)
{
return str.Replace(" ", "_").ToLower();
}
}
class Program
{
static void Main()
{
string text = "Hello World";
Console.WriteLine(text.ToSnakeCase()); // hello_world
}
}
🟠Расширяем `List<int>`
Добавим метод `SumEvenNumbers()`, который суммирует только четные числа в List<int>.
using System;
using System.Collections.Generic;
using System.Linq;
public static class ListExtensions
{
public static int SumEvenNumbers(this List<int> numbers)
{
return numbers.Where(n => n % 2 == 0).Sum();
}
}
class Program
{
static void Main()
{
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6 };
Console.WriteLine(numbers.SumEvenNumbers()); // 12 (2 + 4 + 6)
}
}
🚩Когда использовать extension-методы?
Когда нужно добавить новый метод к существующему классу, но нельзя изменить его код (например, string, List<T>, DateTime).
Когда хочется сделать код более читаемым: numbers.SumEvenNumbers() лучше, чем MyExtensions.SumEvenNumbers(numbers).
Когда нужно улучшить API без наследования и изменения структуры классов.
Ставь 👍 и забирай 📚 Базу знаний5 033
🤔 Что такое команда throw?
throw используется для генерации исключения вручную или повторной генерации перехваченного.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 033
Курс Аналитика в Business Intelligence в НИУ ВШЭ
Удостоверение о повышении квалификации. Подходит начинающим. Онлайн
Курс посвящен работе с BI-системами на примере Tableau, DataLens.
Вы узнаете, как с помощью Business Intelligence визуализировать и готовить данные для дальнейшей работы, а также как настроить дашборд так, чтобы он удовлетворил заказчика.
Узнать больше
#реклама 16+
hse.ru
О рекламодателе
5 033
🤔 Что такое unsafe?
Используется для объявления небезопасного контекста кода, который позволяет выполнять низкоуровневые операции, такие как манипуляции с указателями. Эти операции обычно не разрешены в безопасном управляемом коде, но могут быть необходимы для взаимодействия с неуправляемым кодом, оптимизации производительности или доступа к определенным системным ресурсам.
🚩Характеристики
🟠Объявление небезопасного контекста
Чтобы использовать указатели и выполнять небезопасные операции, нужно объявить метод, блок кода или тип как
unsafe.
unsafe void UnsafeMethod()
{
int a = 10;
int* p = &a; // Использование указателя
Console.WriteLine(*p); // Разыменование указателя
}
🟠Компиляция с поддержкой `unsafe`
Для компиляции кода с unsafe необходимо включить поддержку небезопасного кода в настройках проекта. В Visual Studio это делается через свойства проекта:
1⃣Откройте свойства проекта.
2⃣Перейдите на вкладку "Сборка".
3⃣Установите флажок "Разрешить небезопасный код".
🟠Использование указателей
Указатели позволяют напрямую работать с адресами памяти, что может быть полезно для некоторых оптимизаций или взаимодействия с низкоуровневым кодом, написанным на C или C++.
unsafe void PointerExample()
{
int a = 5;
int* p = &a; // p указывает на адрес переменной a
Console.WriteLine((int)p); // Вывод адреса переменной a
Console.WriteLine(*p); // Вывод значения переменной a через указатель
}
🟠Небезопасные структуры
Вы можете объявлять структуры с указателями и использовать их в небезопасном контексте.
unsafe struct UnsafeStruct
{
public int* Pointer;
}
🟠Стековые указатели (stackalloc)
stackalloc позволяет выделять память в стеке для массива в небезопасном контексте. Это может быть быстрее, чем выделение памяти в куче.
unsafe void StackAllocExample()
{
int* array = stackalloc int[10]; // Выделение массива из 10 целых чисел в стеке
for (int i = 0; i < 10; i++)
{
array[i] = i;
}
}
🟠Взаимодействие с неуправляемым кодом
Небезопасный код часто используется для взаимодействия с API, написанными на других языках, такими как C или C++.
[DllImport("user32.dll")]
extern static unsafe int MessageBox(IntPtr hWnd, char* text, char* caption, int options);
unsafe void CallUnmanagedCode()
{
char* text = "Hello, World!";
char* caption = "My Message Box";
MessageBox(IntPtr.Zero, text, caption, 0);
}
🚩Плюсы
➕Производительность
Позволяет выполнять высокоэффективные операции с памятью.
➕Взаимодействие с неуправляемым кодом
Необходим для вызова функций из библиотек, написанных на других языках.
➕Низкоуровневый контроль
Предоставляет возможность прямого управления памятью и аппаратными ресурсами.
Ставь 👍 и забирай 📚 Базу знаний5 033
Кризис — это не слабость. Это точка, где рождается новое
Но когда рушится привычное, нужна поддержка, смысл и шаг за шагом — выход.
📅 24 мая в 11:00 МСК — бесплатная онлайн-конференция:
«Переживая кризис: как найти смысл и собрать себя заново»
Что тебя ждёт на конференции:
- Разбор ключевых кризисов: потерь, выгорания, одиночества
- Пошаговые техники эмоциональной самопомощи
- Инструменты психологов — чтобы восстановить опору внутри
- Диагностическую карту: «20 вопросов к себе в момент перемен»
- Понимание, как справляться с болью — и вытаскивать из неё ресурс
А еще:
✅ Подарки — iPad, AirPods, OZON, обучение
✅ Онлайн-курс «Верни себе себя»
✅ Доступ в закрытый Telegram-канал
🎓 Подходит и для психологов, и для тех, кто сам в кризисе.
Просто зарегистрируйся. Это бесплатно. Но может поменять твою жизнь.
Зарегистрироваться
#реклама 16+
psy.talentsy.ru
О рекламодателе
5 033
🤔 Что такое reflection и для чего используется?
Это механизм, позволяющий исследовать и взаимодействовать с метаданными типов в рантайме. Используется для динамического вызова методов, получения информации о классах, их свойствах, конструкторах и атрибутах, а также для создания объектов во время выполнения.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 033
🤔 Какие объекты живут в нулевом поколении?
В C# и .NET память управляется сборщиком мусора (Garbage Collector, GC), который делит объекты на три поколения
🟠Generation 0 (Gen 0, нулевое поколение)
самые "молодые" объекты.
🟠Generation 1 (Gen 1, первое поколение)
промежуточные объекты.
🟠Generation 2 (Gen 2, второе поколение)
"долгоживущие" объекты.
🚩Какие объекты попадают в Generation 0?
В Gen 0 живут "короткоживущие" объекты которые создаются и быстро уничтожаются.
Это новые объекты, которые только что были выделены в управляемой куче (Heap).
Обычно это локальные переменные внутри методов, если они не выходят за их пределы.
Пример объектов в Gen 0
class Program
{
static void Main()
{
for (int i = 0; i < 5; i++)
{
var obj = new object(); // Этот объект создаётся в Gen 0
}
GC.Collect(); // Принудительный запуск GC для проверки
}
}
🚩Когда объекты остаются в Gen 0, а когда переходят в следующее поколение?
Если объект быстро умирает → удаляется из Gen 0 при первой же очистке.
Если объект выжил после первой очистки GC → переходит в Gen 1.
Если объект живёт долго → может попасть в Gen 2.
Ставь 👍 и забирай 📚 Базу знаний
Уже доступно! Исследование Telegram 2025 — ключевые инсайты года 
