C# | Вопросы собесов
الذهاب إلى القناة على Telegram
Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @sendme_ads
إظهار المزيد5 015
المشتركون
-124 ساعات
+37 أيام
+2330 أيام
أرشيف المشاركات
5 015
🤔 Какая есть классификация у кучи?
В информатике и программировании куча (heap) может классифицироваться по нескольким критериям. Рассмотрим основные виды:
🟠По назначению:
Куча памяти (Memory Heap)
Используется для динамического выделения памяти в приложениях.
В C# это управляется сборщиком мусора (GC - Garbage Collector).
Примеры: объекты, созданные с помощью
new, выделяются в управляемой куче.
🟠Структура данных «Куча» (Heap Data Structure)
Это специальная бинарная структура данных, используемая в алгоритмах, например, в сортировке (Heap Sort) или в приоритетных очередях.
Бывает максимальная куча (max-heap) и минимальная куча (min-heap).
🚩По типу управления памятью (для кучи памяти в языках программирования):
🟠Управляемая куча (Managed Heap)
В C# и .NET память выделяется и освобождается автоматически с помощью GC. Разделяется на поколения (Generation 0, 1, 2), что оптимизирует работу сборщика мусора.
🟠Неуправляемая куча (Unmanaged Heap)
Применяется в C/C++ и низкоуровневом коде, где управление памятью выполняется вручную (malloc/free, new/delete). В C# тоже можно работать с ней через Marshal или Unsafe код.
🟠По структуре данных (Heap Data Structure):
🟠Максимальная куча (Max Heap)
Корневой узел содержит наибольшее значение, а дочерние узлы – меньшее. Используется в алгоритмах приоритетных очередей.
🟠Минимальная куча (Min Heap)
Корневой узел содержит наименьшее значение, а дочерние узлы – большее. Применяется в алгоритме Дейкстры и других задачах.
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
PriorityQueue<int, int> minHeap = new PriorityQueue<int, int>();
minHeap.Enqueue(5, 5);
minHeap.Enqueue(3, 3);
minHeap.Enqueue(8, 8);
minHeap.Enqueue(1, 1);
while (minHeap.Count > 0)
{
Console.WriteLine(minHeap.Dequeue()); // Выведет: 1, 3, 5, 8
}
}
}
Ставь 👍 и забирай 📚 Базу знаний5 015
🤔 Что такое CancellationToken в многопоточности?
CancellationToken — это объект, который позволяет управлять отменой операций, особенно асинхронных.
Используется для:
- Прерывания задач Task, async-await
- Передачи сигнала отмены в долгоживущие процессы (загрузки, ожидания)
- Контроля над временем жизни операции
С помощью CancellationTokenSource можно отправить команду отмены, и все обработчики, использующие связанный токен, корректно завершат выполнение.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 015
🤔 Что такое исключения?
Исключения в программировании — это механизмы обработки ошибок и необычных ситуаций, которые возникают во время выполнения программы. В C# и других языках программирования исключения позволяют отделить код обработки ошибок от основного кода программы, что упрощает его чтение и поддержку.
🚩Основные понятия
🟠Исключение (Exception)
Событие, которое прерывает нормальный поток выполнения программы.
🟠Блок try
Содержит код, который может вызвать исключение.
🟠Блок catch
Содержит код, который выполняется, если возникает исключение. В catch блок можно передать параметр — экземпляр исключения, которое произошло.
🟠Блок finally
Содержит код, который выполняется в любом случае, независимо от того, произошло исключение или нет. Обычно используется для освобождения ресурсов.
🟠Бросание исключения (throw)
Механизм для явного вызова исключения.
🚩Пример использования
Основные блоки
try
{
// Код, который может вызвать исключение
int divisor = 0;
int result = 10 / divisor;
}
catch (DivideByZeroException ex)
{
// Обработка исключения
Console.WriteLine("Деление на ноль невозможно.");
}
finally
{
// Код, который выполнится в любом случае
Console.WriteLine("Блок finally выполнен.");
}
Создание и бросание собственного исключения
public class InvalidAgeException : Exception
{
public InvalidAgeException(string message) : base(message) { }
}
public void SetAge(int age)
{
if (age < 0)
{
throw new InvalidAgeException("Возраст не может быть отрицательным.");
}
// Логика установки возраста
}
Ставь 👍 и забирай 📚 Базу знаний5 015
🤔 Какие известны правила наименования в REST?
REST-принципы ориентированы на читаемость и предсказуемость URL. Вот основные правила:
- Использовать существительные во множественном числе для ресурсов:
/users, /orders, /products.
- Использовать HTTP-глаголы для операций, а не глаголы в URI:
/getUsers, GET /users.
- Иерархическая структура:
/users/123/orders — заказы конкретного пользователя.
- Без заглавных букв:
использовать kebab-case или snake_case: /user-profile, /user_profile.
- Не включать действия в путь, они определяются методом:
DELETE /users/123 — удаление, а не /deleteUser.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 015
🤔 Что такое примитив синхронзиации semaphore?
Это механизм синхронизации, который используется для управления доступом к ограниченному ресурсу. Он позволяет ограниченному количеству потоков одновременно использовать общий ресурс.
🚩Как работает семафор?
Семафор использует счётчик для отслеживания доступных "разрешений":
Когда поток запрашивает доступ к ресурсу, семафор уменьшает счётчик.
Если счётчик больше нуля, поток получает доступ.
Если счётчик равен нулю, поток блокируется, пока другой поток не освободит ресурс (увеличив счётчик).
🚩Пример использования `SemaphoreSlim`
В .NET часто используется
SemaphoreSlim, так как он более лёгкий и эффективный, чем Semaphore.
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static SemaphoreSlim semaphore = new SemaphoreSlim(2); // Разрешаем максимум 2 потока одновременно
static async Task AccessResource(int id)
{
Console.WriteLine($"Поток {id} ждёт доступа...");
await semaphore.WaitAsync(); // Захватываем семафор
try
{
Console.WriteLine($"Поток {id} получил доступ!");
await Task.Delay(2000); // Имитация работы с ресурсом
}
finally
{
Console.WriteLine($"Поток {id} освобождает ресурс.");
semaphore.Release(); // Освобождаем семафор
}
}
static async Task Main()
{
Task[] tasks = new Task[5];
for (int i = 0; i < 5; i++)
{
tasks[i] = AccessResource(i);
}
await Task.WhenAll(tasks);
}
}
🚩Обычный `Semaphore`
Если нужна синхронизация между разными процессами, можно использовать Semaphore
Semaphore semaphore = new Semaphore(2, 2, "MyGlobalSemaphore");
Ставь 👍 и забирай 📚 Базу знаний5 015
🤔 Является ли POST идемпотентным?
Нет, метод POST не является идемпотентным. Каждый повторный вызов POST может создавать новые ресурсы или изменять состояние системы, что приводит к разным результатам. Это типичный метод для операций создания или изменения, и его повторение может вызвать дублирование или непредсказуемый эффект.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 015
🤔 Пример выполнения кода, когда возвращается объект интерфейса Iqueryable?
IQueryable<T> — это интерфейс, который используется для отложенного выполнения запросов (deferred execution). Он позволяет строить SQL-запросы к базе данных или манипулировать данными в памяти, но сам запрос выполняется только в момент его итерации (ToList(), FirstOrDefault(), Count(), и т. д.).
🚩Пример работы с `IQueryable<T>` на Entity Framework Core
Предположим, у нас есть сущность Product и контекст базы данных AppDbContext
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
public class AppDbContext : DbContext
{
public DbSet<Product> Products { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer("YourConnectionString");
}
}
Теперь создадим репозиторий, который возвращает IQueryable<Product>
public class ProductRepository
{
private readonly AppDbContext _context;
public ProductRepository(AppDbContext context)
{
_context = context;
}
public IQueryable<Product> GetProducts()
{
return _context.Products.Where(p => p.Price > 100);
// Запрос не выполняется здесь! Только формируется
}
}
🚩Вызов метода и выполнение запроса
Запрос к базе данных выполнится только при материализации (ToList(), FirstOrDefault(), Count(), и т. д.).
var repository = new ProductRepository(new AppDbContext());
// Создаём IQueryable-запрос
IQueryable<Product> query = repository.GetProducts();
// Добавляем дополнительное условие (запрос еще НЕ выполнен)
query = query.OrderBy(p => p.Name);
// Теперь выполняем запрос к БД
List<Product> products = query.ToList(); // SQL-запрос отправляется в базу
Ставь 👍 и забирай 📚 Базу знаний5 015
🤔 Что такое предикат?
Это делегат, представляющий метод, который принимает параметр и возвращает булево значение (true или false). Используется для фильтрации данных в LINQ или коллекциях.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 015
🤔 Какой сейчас последний C#?
🚩Нововведения
🟠Primary Constructors для классов и структур
Позволяют определять конструкторы прямо в объявлении класса или структуры, что упрощает код и улучшает его читаемость.
public class Person(string name, int age)
{
public string Name { get; } = name;
public int Age { get; } = age;
}
🟠Collection Literals
Обеспечивает более удобный синтаксис для создания коллекций.
var numbers = [1, 2, 3, 4, 5];
🟠Default Values для auto-properties
Теперь можно задавать значения по умолчанию для auto-properties, что делает код более лаконичным.
public string Name { get; set; } = "Unknown";
🟠Using aliases
Позволяет использовать алиасы для пространств имен, улучшая читаемость кода.
using Text = System.Text;
🟠Improved Lambda Expressions:
Улучшены возможности для работы с лямбда-выражениями, делая их более гибкими и мощными.
🚩Зачем нужны эти изменения?
Эти нововведения направлены на упрощение синтаксиса языка, улучшение читаемости и поддерживаемости кода, а также на повышение производительности и удобства разработки.
public class Program
{
public static void Main()
{
var person = new Person("John", 30);
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");
var numbers = [1, 2, 3, 4, 5];
numbers.ForEach(n => Console.WriteLine(n));
var name = new Name { Value = "Unknown" };
Console.WriteLine(name.Value);
}
}
public class Person(string name, int age)
{
public string Name { get; } = name;
public int Age { get; } = age;
}
public class Name
{
public string Value { get; set; } = "Default Name";
}
Ставь 👍 и забирай 📚 Базу знаний5 015
🤔 Можно ли в рамках lock использовать await?
Нет, нельзя. Ожидание с await может привести к тому, что поток выйдет из текущего блока и продолжит выполнение в другом — это нарушает правила lock, который должен оставаться в одном потоке. Для асинхронного кода используют другие механизмы синхронизации.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 015
🤔 Что такое метод Finalize?
Метод Finalize() представляет собой специальный метод, который предназначен для выполнения финальной очистки ресурсов перед тем, как объект будет уничтожен сборщиком мусора. Это метод, который может быть определен в классе для очистки неуправляемых ресурсов, если класс не реализует интерфейс
IDisposable.
🚩Особенности метода
🟠Автоматический вызов
Сборщик мусора автоматически вызывает Finalize() на объекте, который не имеет других активных ссылок и который определяет финализатор. Это происходит непосредственно перед тем, как сборщик мусора освобождает память, занимаемую объектом.
🟠Определение в базовом классе `Object`
Все объекты наследуют от базового класса Object, который предоставляет реализацию Finalize(). Однако в большинстве случаев Finalize() не имеет реализации и не делает ничего, пока не будет переопределен в производном классе.
🟠Замедление сборки мусора
Наличие объектов с финализаторами может замедлить процесс сборки мусора, так как объекты, требующие финализации, должны быть обработаны дважды: сначала они помещаются в очередь финализации, а затем их память освобождается после выполнения Finalize().
class ResourceWrapper
{
// Конструктор
public ResourceWrapper() {
// Инициализация ресурсов
}
// Финализатор
~ResourceWrapper() {
// Код очистки ресурсов
}
}
Ставь 👍 и забирай 📚 Базу знаний5 015
🤔 Как происходит ожидание в ThreadPool?
Ожидание реализуется через:
- Очередь задач — пока поток занят, новая задача стоит в очереди.
- Потоки из пула не блокируются, если задача асинхронная — они освобождаются и берут новые задачи.
- При высокой нагрузке пул может расширяться динамически (до определённого лимита).
Ожидание может быть как активным (через WaitHandle, Task.Wait()), так и пассивным (через await).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 015
🤔 Что такое паттерн MVVM?
MVVM (Model-View-ViewModel) — это паттерн проектирования, который разделяет логику программы и интерфейс пользователя. Он широко используется в WPF, Xamarin, MAUI и Blazor.
🚩Как они взаимодействуют?
ViewModel обновляет Model (через
Command и INotifyPropertyChanged).
Model уведомляет ViewModel об изменениях.
View автоматически обновляется (через Data Binding).
🚩Пример MVVM в WPF
Model (Модель)
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
ViewModel (Логика)
using System.ComponentModel;
using System.Runtime.CompilerServices;
public class PersonViewModel : INotifyPropertyChanged
{
private string _name;
public string Name
{
get => _name;
set { _name = value; OnPropertyChanged(); }
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
=> PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
View (XAML)
<TextBox Text="{Binding Name, Mode=TwoWay}" />
<TextBlock Text="{Binding Name}" />
Ставь 👍 и забирай 📚 Базу знаний5 015
🤔 Какие объекты можно использовать в foreach?
В foreach-цикле можно использовать любые объекты, которые реализуют интерфейс IEnumerable (в .NET) или Iterable (в Java).
Это могут быть:
- массивы;
- коллекции (List, Set, Dictionary, ArrayList, и др.);
- результат LINQ-запроса;
- пользовательские коллекции, если реализуют IEnumerable.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 015
🤔 Какие методы есть в Action фильтре?
Используются для выполнения логики до и после выполнения метода действия контроллера. Они предоставляют механизм для выполнения кросс-секционных задач, таких как логирование, обработка исключений, валидация и т.д. Action фильтры реализуют интерфейс
IActionFilter или IAsyncActionFilter.
🚩Методы в Action фильтре
🟠OnActionExecuting
Этот метод вызывается перед выполнением метода действия. Здесь можно добавить логику, которая будет выполняться до вызова действия, например, логирование или проверка условий.
public void OnActionExecuting(ActionExecutingContext context)
{
// Логика до выполнения действия
}
🟠OnActionExecuted
Этот метод вызывается после выполнения метода действия. Здесь можно добавить логику, которая будет выполняться после вызова действия, например, логирование результатов или модификация ответа.
public void OnActionExecuted(ActionExecutedContext context)
{
// Логика после выполнения действия
}
🟠OnActionExecutionAsync
Этот метод объединяет функциональность OnActionExecuting и OnActionExecuted в одном асинхронном методе. Здесь можно определить логику, которая будет выполняться как до, так и после выполнения метода действия.
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
// Логика до выполнения действия
var resultContext = await next();
// Логика после выполнения действия
}
🚩Реализации Action фильтра
Синхронный Action фильтр:
public class SampleActionFilter : IActionFilter
{
public void OnActionExecuting(ActionExecutingContext context)
{
// Логика до выполнения действия
Console.WriteLine("Before executing action");
}
public void OnActionExecuted(ActionExecutedContext context)
{
// Логика после выполнения действия
Console.WriteLine("After executing action");
}
}
Асинхронный Action фильтр:
public class SampleAsyncActionFilter : IAsyncActionFilter
{
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
// Логика до выполнения действия
Console.WriteLine("Before executing action");
var resultContext = await next();
// Логика после выполнения действия
Console.WriteLine("After executing action");
}
}
🚩Применение Action фильтра
Action фильтр можно применять к контроллерам или действиям контроллера с помощью атрибута [ServiceFilter] или [TypeFilter]. Также его можно зарегистрировать глобально в Startup.cs.
Применение к контроллеру или действию:
[ServiceFilter(typeof(SampleActionFilter))]
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}
}
Глобальная регистрация:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(config =>
{
config.Filters.Add(typeof(SampleActionFilter));
});
}
Ставь 👍 и забирай 📚 Базу знаний5 015
Как менеджеру маркетплейсов выйти на доход 150 000 ₽
Хочешь за год выйти на доход от 150 000 ₽ и больше, работая из дома и не рискуя своими деньгами? Профессия менеджера маркетплейсов позволяет зарабатывать на чужих товарах, используя аналитику и инструменты продвижения..
На бесплатном мастер-классе мы разберём метод 2026 года выхода на стабильный доход и ты поймёшь, как превратить разовые проекты в очереди из клиентов..
⚡ Узнаешь пошаговую стратегию роста личного дохода до 150 000 ₽.
⚡ Получишь инструкцию по авторекламе и гайд «11 способов заработать без вложений».
⚡ Получишь ключевые навыки менеджера Wildberries.
Зарегистрируйся на бесплатный мастер-класс и забронируй своё место онлайн!
Зарегистрироваться
#реклама 16+
club.marketguru.io
О рекламодателе
5 015
🤔 Что такое многопоточность?
Многопоточность — это возможность выполнения нескольких потоков (threads) одновременно в одной программе. В C# многопоточность поддерживается с помощью класса `Thread`, задач (`Task`) и `ThreadPool`. Многопоточность используется для выполнения параллельных операций, таких как обработка данных или выполнение задач, которые не должны блокировать основной поток. Она помогает повысить производительность, но требует осторожности для предотвращения гонок данных и взаимоблокировок.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 015
🤔 Какие типы данных можно использовать у Dictionary в качестве ключа?
В C# ключ (
TKey) в Dictionary<TKey, TValue> должен быть уникальным и поддерживать сравнение.
Лучше всего использовать неизменяемые (immutable) типы, такие как:
Примитивные типы (int, string, char, bool, Guid, enum)
Кортежи (Tuple, ValueTuple)
Неизменяемые структуры (struct, если переопределён Equals и GetHashCode)
🚩Какие типы подходят в качестве ключа?
Числовые типы (int, double, long)
var dict = new Dictionary<int, string>
{
{1, "Один"},
{2, "Два"}
};
Console.WriteLine(dict[1]); // Вывод: Один
string (лучший выбор)
var dict = new Dictionary<string, int>
{
{"apple", 10},
{"banana", 5}
};
Console.WriteLine(dict["apple"]); // 10
Guid (уникальные идентификаторы)
var dict = new Dictionary<Guid, string>
{
{Guid.NewGuid(), "User1"},
{Guid.NewGuid(), "User2"}
};
enum (хороший вариант)
enum Status { New, Processing, Completed }
var dict = new Dictionary<Status, string>
{
{Status.New, "Заказ создан"},
{Status.Processing, "Заказ в обработке"}
};
Можно использовать несколько значений в качестве ключа:
var dict = new Dictionary<(int, string), string>
{
{(1, "apple"), "Красное яблоко"},
{(2, "banana"), "Жёлтый банан"}
};
Console.WriteLine(dict[(1, "apple")]); // Красное яблоко
🚩Какие типы нельзя использовать в качестве ключа?
List<T> (и другие изменяемые коллекции)
var dict = new Dictionary<List<int>, string>(); // Ошибка при использовании в качестве ключа!
class, если не переопределён Equals и GetHashCode
class Person { public string Name; }
var dict = new Dictionary<Person, string>(); // Плохо!
Нужно переопределить Equals и GetHashCode
class Person
{
public string Name { get; }
public Person(string name) => Name = name;
public override bool Equals(object? obj)
{
return obj is Person other && Name == other.Name;
}
public override int GetHashCode() => Name.GetHashCode();
}
Ставь 👍 и забирай 📚 Базу знаний5 015
🤔 Что такое инверсия зависимостей?
Это это принцип SOLID, согласно которому высокоуровневые модули не должны зависеть от низкоуровневых, а оба должны зависеть от абстракций. Это снижает связанность кода и делает систему гибче.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 015
🤔 Какие есть подходы в рамках эфкора?
Entity Framework Core (EF Core) — это ORM (Object-Relational Mapping), которая упрощает работу с базой данных в C#.
Основные подходы работы с EF Core:
Code First (Код → База)
Database First (База → Код)
Model First (Модель → База → Код)
🚩Code First (Сначала код)
Сначала создаётся код (C# классы), а база данных создаётся автоматически.
Если у нас нет готовой базы данных
Когда разрабатываем с нуля
Легче вносить изменения через миграции
1⃣Создаём модель
public class User
{
public int Id { get; set; }
public string Name { get; set; }
}
2⃣Создаём контекст (DbContext)
public class AppDbContext : DbContext
{
public DbSet<User> Users { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder options)
=> options.UseSqlServer("Server=.;Database=TestDb;Trusted_Connection=True;");
}
3⃣Применяем миграции
dotnet ef migrations add InitialCreate
dotnet ef database update
🚩Database First (Сначала база)
База данных уже есть → EF Core генерирует код (модели, DbContext).
Когда уже существует база
Когда работаете с наследуемой системой
Как сгенерировать модели из базы?
dotnet ef dbcontext scaffold "Server=.;Database=TestDb;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -o Models
🚩Model First (Сначала модель)
Создаём модель (визуально), потом генерируем базу и код.
Не поддерживается в EF Core! (была в EF 6)
В старых проектах (EF 6) с визуальным проектированием
Когда нужна автогенерация схемы БД
Используйте Code First с миграциями вместо Model First.
Ставь 👍 и забирай 📚 Базу знаний