C# | Вопросы собесов
5.1K subscribers
36 photos
1 file
990 links
Download Telegram
🤔 Какие типы связей известны у join`ов?

- Inner Join: Объединяет только те строки, которые совпадают в обеих таблицах.
- Left Join: Возвращает все строки из левой таблицы и соответствующие строки из правой.
- Right Join: Аналогично Left Join, но для правой таблицы.
- Full Join: Возвращает все строки из обеих таблиц.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🎉2👀1💊1
🤔 В чём разница между throw и throw ex в С#?

В C# есть два способа выбросить исключение внутри блока catch:
1. throw;
2. throw ex;
Хотя они выглядят похоже, есть ключевое отличие в сохранении стека вызовов (stack trace).

🚩`throw;` — сохраняет оригинальный стек вызовов

Когда используется просто throw;, исключение передаётся дальше без изменения информации о месте его возникновения.
try
{
int x = 0;
int y = 5 / x; // Здесь возникнет DivideByZeroException
}
catch (Exception ex)
{
Console.WriteLine("Ошибка: " + ex.Message);
throw; // Исключение передаётся дальше без изменений
}


🚩`throw ex;` — сбрасывает стек вызовов

Когда используется throw ex;, создаётся новая точка выброса исключения, и оригинальный стек вызовов теряется.
try
{
int x = 0;
int y = 5 / x;
}
catch (Exception ex)
{
Console.WriteLine("Ошибка: " + ex.Message);
throw ex; // Оригинальный стек вызовов теряется
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👀5👍3🔥1
Forwarded from easyoffer
Я боялся, что провалю собеседование. Так появился easyoffer

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

Типа… ты потратил месяцы на то, чтобы учиться, писал pet-проекты, собирал резюме, рассылаешь отклики — и всё может закончиться на одном-единственном вопросе, на который ты не знаешь ответ.

Я реально боялся.
Я смотрел видео mock-собеседований на YouTube, останавливал каждое, выписывал вопросы в Notion. Потом вручную писал к ним ответы. И потом ещё по нескольку раз перечитывал. Такой вот "тренажёр" на коленке.

📎 (там на картинке — один из моих реальных списков в Notion, ставь 🔥 если тоже так делал)

В какой-то момент я посчитал — у меня уже было выписано больше 500 вопросов. Я почувствовал ужас.
Потому что невозможно всё это зазубрить. А что, если спросят как раз тот, к которому я не успел подготовиться?..

Тогда и пришла идея

А что если понять, какие из вопросов встречаются чаще всего? Чтобы не учить всё подряд, а сфокусироваться на главном.

Так родился easyoffer.

Сначала — просто как пет-проект, чтобы показать в резюме и подготовиться к собесам. А потом оказалось, что он реально помогает людям. За первые месяцы его посетили сотни тысяч человек. И я понял: это больше, чем просто пет-проект.

Сейчас я делаю EasyOffer 2.0
И уже не один, а вместе с вами.

В новой версии будут:
– вопросы из реальных собесов, с фильтрацией по грейду, компании, типу интервью
– тренажёр с карточками (по принципу интервальных повторений — как в Anki)
– база задач с интервью
– тренажёр «реальное собеседование», чтобы отрепетировать как в жизни

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

Я делаю всё на свои деньги. Никаких инвесторов. Только вы и я.

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

Все, кто поддержат проект до релиза, получат:

🚀 1 год PRO-доступа по цене месячной подписки. Его можно активировать в любое время, например когда начнете готовится к собесам.
Доступ к закрытому бета-тесту

Поддержать 👉 https://planeta.ru/campaigns/easyoffer

Спасибо, что верите в этот проект 🙌
3😁1
🤔 Тип string относится к Reference или Value?

Тип string — это ссылочный тип. Однако, в отличие от других ссылочных типов, строки являются неизменяемыми (immutable). Это значит, что при любом изменении строки создаётся новый объект в памяти, а старый остаётся неизменным.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
🤔 Какой сейчас последний 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";
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🤔3👀21🔥1
🤔 Что такое паттерн разработки — Строитель (Builder)?

Строитель применяется, когда нужно пошагово создать сложный объект, избегая громоздкого конструктора с множеством параметров.
Он позволяет:
- Создавать разные представления одного и того же объекта.
- Разделить конструирование от представления.
- Собирать объект поэтапно и настраиваемо.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥1
🤔 Что такое аутентификация?

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

🚩Как работает аутентификация?

Пользователь вводит данные (например, логин и пароль).
Система проверяет их в базе данных.
Если данные верны → доступ разрешён.
Если данные неверны → отказ в доступе.

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 и микросервисах. Позволяет работать без сохранения сессий.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🤯1
🤔 Что такое примитив синхронизации semaphore?

Семафор — это ограничитель доступа, который позволяет нескольким потокам одновременно использовать ресурс, но только в пределах установленного количества. Например, если доступно 3 слота — максимум 3 потока могут работать параллельно, остальные ждут.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥1
🤔 Что такое контекст синхронизации?

"контекст синхронизации" (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 из асинхронных или вторичных потоков.
🟠Правильное управление потоками
Обеспечивает выполнение кода в контексте, для которого он предназначен, что особенно важно в многопоточных и сетевых приложениях.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥1
🤔 Что такое паттерн Event Sourcing?

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

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥1
🤔 В чём разница статических и нестатических классов?

В C# классы могут быть статическими (static) и нестатическими (обычными). Разница в том, как они используются и хранят данные.

🚩Статические классы (`static`)

Не могут создавать объекты (экземпляры)
Содержат только статические (static) методы и поля
Не могут наследоваться и не могут быть унаследованы
Используются для утилитарных методов, глобальных констант и вспомогательных функций
public static class MathHelper
{
public static int Square(int x) => x * x;
}


Использование
int result = MathHelper.Square(5); // 25


🚩Нестатические (обычные) классы
Можно создавать экземпляры (new)
Могут содержать как статические, так и нестатические члены
Можно наследовать от других классов
Используются для работы с данными
public class Car
{
public string Model { get; set; }

public void Drive()
{
Console.WriteLine($"{Model} едет!");
}
}


Использование
Car myCar = new Car { Model = "Tesla" };
myCar.Drive(); // Tesla едет!


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
🤔 Что такое I/O bound и CPU bound?

- I/O-bound — задачи, основное время которых уходит на ожидание внешних операций: чтение файлов, запросы в сеть или базу данных.
Решение: использовать асинхронность, чтобы не блокировать поток.
- CPU-bound — задачи, требующие активных вычислений, загрузки процессора (например, шифрование, расчёты).
Решение: запускать на отдельных потоках или использовать параллелизм.
Знание разницы помогает выбрать стратегию оптимизации.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
🤔 Какие есть методы запросов жизненного цикла в asp.net Core?

В ASP.NET Core жизненный цикл запроса проходит несколько этапов — от получения HTTP-запроса до отправки ответа. В этом процессе участвуют Middleware, контроллеры, фильтры и обработчики событий.

🚩Основные этапы жизненного цикла запроса

Получение запроса (HttpContext создаётся)
Обработка через Middleware (передача запроса вниз)
Маршрутизация (Routing) — определение контроллера
Фильтры (например, аутентификация)
Вызов контроллера и метода (Action)
Обратный проход через Middleware (формирование ответа)
Отправка ответа клиенту

🚩Методы Middleware (Промежуточное ПО)

Middleware — это основной механизм обработки запросов.
Где регистрируются? → В Program.csapp.Use...)
Методы Middleware
app.Use(async (context, next) =>
{
Console.WriteLine("Перед обработкой запроса");
await next(); // Передаём запрос дальше
Console.WriteLine("После обработки запроса");
});


🚩Методы в контроллерах (`Controller`)

Контроллер обрабатывает запросы после маршрутизации.
Основные методы
public class HomeController : Controller
{
// Метод вызывается при GET-запросе
public IActionResult Index()
{
return View();
}

// Метод вызывается при POST-запросе
[HttpPost]
public IActionResult SubmitForm(FormModel model)
{
return RedirectToAction("Index");
}
}


🚩Фильтры (`Filters`)
Фильтры выполняются до и после вызова контроллера.
Методы фильтров
public class MyActionFilter : IActionFilter
{
public void OnActionExecuting(ActionExecutingContext context)
{
Console.WriteLine("Перед вызовом метода контроллера");
}

public void OnActionExecuted(ActionExecutedContext context)
{
Console.WriteLine("После вызова метода контроллера");
}
}


🚩Методы жизненного цикла в `Program.cs`

В ASP.NET Core 6+ вся конфигурация находится в Program.cs.
Методы инициализации
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllersWithViews(); // Подключаем MVC

var app = builder.Build();

app.UseRouting(); // Включаем маршрутизацию
app.UseAuthorization(); // Проверка прав
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers(); // Подключаем контроллеры
});

app.Run();


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6👀1💊1
🤔 Как оптимизировать ситуацию, когда к таблице много join?

1. Проверить необходимость всех join — убрать ненужные связи.
2. Использовать индексы — создать индексы на ключевых колонках.
3. Разделить запрос — разбить сложный запрос на несколько более простых.
4. Использовать denormalization — объединить часто используемые данные в одну таблицу.
5. Кэшировать данные — уменьшить нагрузку на базу данных.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4👍1
🤔 Что такое метод Finalize?

Метод Finalize() представляет собой специальный метод, который предназначен для выполнения финальной очистки ресурсов перед тем, как объект будет уничтожен сборщиком мусора. Это метод, который может быть определен в классе для очистки неуправляемых ресурсов, если класс не реализует интерфейс IDisposable.

🚩Особенности метода

🟠Автоматический вызов
Сборщик мусора автоматически вызывает Finalize() на объекте, который не имеет других активных ссылок и который определяет финализатор. Это происходит непосредственно перед тем, как сборщик мусора освобождает память, занимаемую объектом.

🟠Определение в базовом классе `Object`
Все объекты наследуют от базового класса Object, который предоставляет реализацию Finalize(). Однако в большинстве случаев Finalize() не имеет реализации и не делает ничего, пока не будет переопределен в производном классе.

🟠Замедление сборки мусора
Наличие объектов с финализаторами может замедлить процесс сборки мусора, так как объекты, требующие финализации, должны быть обработаны дважды: сначала они помещаются в очередь финализации, а затем их память освобождается после выполнения Finalize().

class ResourceWrapper
{
// Конструктор
public ResourceWrapper() {
// Инициализация ресурсов
}

// Финализатор
~ResourceWrapper() {
// Код очистки ресурсов
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Forwarded from easyoffer
Осталось всего 14 дней до завершения краудфандинга

Сейчас самое подходящее время подключиться, если вы ждали или откладывали:

Все, кто поддержат проект сейчас, до релиза, получат:
🚀 PRO-доступ на 1 год по цене месячной подписки
Бета-доступ к EasyOffer 2.0 (конец мая)

👉 Поддержать: https://planeta.ru/campaigns/easyoffer
😁2🤯1👀1
🤔 Зачем нужны операторы?

Операторы в C# позволяют:
- Выполнять арифметические, логические и побитовые операции (+, -, &&, |, <<, ++).
- Сравнивать значения (==, !=, >, <).
- Управлять потоком исполнения (??, ?:, is, as, await).
- Создавать собственные операторы перегрузки (например, operator + для собственного класса).
Операторы — важная часть языка, они позволяют делать код лаконичным, выразительным и типобезопасным.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🤔41😁1🤯1
🤔 Как проводить тестирование и отладку?

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

🟠Использование отладчика (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 для анализа дампов.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
🤔 Какие есть виды приведения типов?

1. Явное (explicit) — требует указания типа вручную. Может привести к ошибке времени выполнения.
2. Неявное (implicit) — происходит автоматически, когда не теряется информация.
3. Пользовательское (custom) — через оператор operator или as/is.
4. Boxing/Unboxing — упаковка значимых типов в объект и обратно.
5. Приведение интерфейсов/наследования — преобразование к базовому или интерфейсному типу.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4