C# | Вопросы собесов
5.1K subscribers
36 photos
1 file
990 links
Download Telegram
🤔 Что такое АУС-2?

Это автоматизированная управляющая система второго уровня (чаще встречается в контексте производств, ТЭК или крупных предприятий).
Конкретная расшифровка зависит от контекста (например, у «Газпрома» или РЖД может быть своя трактовка). Обычно речь о высокоуровневом управлении технологическими процессами, над АСУ ТП.


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

В C# существует множество различных типов данных, которые можно разделить на две основные категории: значимые типы (value types) и ссылочные типы (reference types). Рассмотрим каждую из этих категорий и их подтипы.

🚩Значимые типы (Value Types)

Значимые типы хранят данные непосредственно в своей памяти. Они обычно располагаются в стеке и имеют фиксированный размер. К значимым типам относятся:

🟠Простые типы (Simple Types)
Числовые типы
Целочисленные типы:
byte (8 бит)
sbyte (8 бит)
short (16 бит)
ushort (16 бит)
int (32 бита)
uint (32 бита)
long (64 бита)
ulong (64 бита)
Вещественные типы:
float (32 бита)
double (64 бита)
Десятичный тип:
decimal (128 бит)
Логический тип
bool (1 бит, значения true или false)
Символьный тип
char (16 бит, символы в формате Unicode)

🟠Структуры (Structs)
Пользовательские типы, которые могут содержать поля, свойства и методы. Пример: struct Point { public int X; public int Y; }

🟠Перечисления (Enums)
Специальные типы, представляющие набор именованных констант. Пример: enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday }

🟠Nullable Types
Типы, которые могут принимать значение null. Пример: int?, double?

🚩Ссылочные типы (Reference Types)

🟠Классы (Classes)
Основные объекты в C#, могут содержать поля, свойства, методы и события. Пример: class Person { public string Name; public int Age; }

🟠Интерфейсы (Interfaces)
Определяют контракт, который должны реализовать классы. Пример: interface IMovable { void Move(); }

🟠Массивы (Arrays)
Коллекции однотипных элементов. Пример: int[] numbers = new int[5];

🟠Делегаты (Delegates)
Типы, которые представляют собой ссылки на методы. Пример: delegate void Process(int value);

🟠Строки (Strings)
Непосредственно представляют собой последовательность символов. Пример: string message = "Hello, World!";

🟠Записи (Records)
Новый тип в C# 9.0, предназначенный для неизменяемых объектов. Пример: record Person(string Name, int Age);

🚩Примеры и использование

Значимые типы
int a = 5;
float b = 3.14f;
bool isTrue = true;
char letter = 'A';


Ссылочные типы
string message = "Hello, World!";
Person person = new Person { Name = "Alice", Age = 30 };

int[] numbers = new int[] { 1, 2, 3, 4, 5 };


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
🤔 Чем Action отличается от Func?

Action<T> представляет метод, который ничего не возвращает (void), а Func<T, TResult> – метод, который возвращает значение. Func всегда имеет возвращаемый тип, а Action – нет.


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

Dispose метод является частью паттерна управления ресурсами, известного как "Dispose Pattern". Этот метод реализуется в классах через интерфейс IDisposable. Цель — явное освобождение неуправляемых ресурсов и, по желанию, управляемых ресурсов, прежде чем сборщик мусора освободит объект. Это важно для эффективного управления памятью и другими системными ресурсами.

🚩Неуправляемые и управляемые ресурсы

🟠Неуправляемые ресурсы
включают в себя ресурсы, которые не управляются средой CLR (Common Language Runtime), например, файловые дескрипторы, сетевые соединения или указатели на память, выделенную вне .NET среды.
🟠Управляемые ресурсы
это объекты .NET, которые занимают память и потенциально удерживают ссылки на неуправляемые ресурсы.

🚩Как он работает

Должен освобождать все неуправляемые ресурсы, занимаемые объектом, а также должен иметь возможность освобождать управляемые ресурсы, если это необходимо. Как правило, управляемые ресурсы освобождаются сами сборщиком мусора, но если управляемый ресурс включает в себя неуправляемые ресурсы, тогда Dispose может быть вызван для их явного освобождения.
public class ResourceHolder : IDisposable
{
private bool disposed = false;

public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}

protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
// Освобождение управляемых ресурсов
}
// Освобождение неуправляемых ресурсов
disposed = true;
}
}

~ResourceHolder()
{
Dispose(false);
}
}


Пример использования Dispose
using (var resource = new ResourceHolder())
{
// Использование ресурса
}
// Метод Dispose автоматически вызывается при выходе из блока using


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

SignalR — это библиотека от Microsoft для обеспечения двусторонней связи в реальном времени между клиентом и сервером. Она использует протоколы, такие как WebSockets, для высокой производительности, а в случае их недоступности — другие технологии, например, long polling. SignalR упрощает разработку чатов, уведомлений и других динамичных приложений.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥5
🤔 Зачем нужны поколения для сборщика мусора в JS?

В JavaScript (как и в C#) сборщик мусора (Garbage Collector, GC) использует поколения (generational GC) для оптимизации работы с памятью. Это помогает быстрее и эффективнее очищать ненужные объекты, минимизируя задержки в работе программы.

🚩Зачем нужны поколения в GC?

🟠Большинство объектов "живут" недолго
В среднем, переменные и объекты в JS создаются и быстро перестают использоваться. Например, временные объекты в функциях.

🟠Некоторые объекты "живут" долго
Например, глобальные переменные, кэш данных или объекты в setInterval.

🟠Очистка памяти должна быть быстрой
Проверять всю память каждый раз — дорого по времени. GC должен быстро убирать "мусор", не замедляя выполнение кода.

🚩Как работают поколения?

JS-движки, например V8 (Chrome, Node.js), используют Generational Garbage Collection — деление объектов на молодые (new generation) и старые (old generation).
🟠Молодое поколение (Young Generation)
Сюда попадают новые объекты.
GC часто проверяет эту область и быстро очищает.
Если объект "выжил" несколько проверок, он переносится в старшее поколение.
🟠Старое поколение (Old Generation)
Здесь хранятся "долгоживущие" объекты.
Проверяется реже, так как здесь объекты реже становятся мусором.
Очистка более сложная и дорогая по времени.

Пример работы GC в V8
function createObjects() {
let obj1 = { name: "temp" }; // попадает в Young Generation
let obj2 = { data: new Array(1000).fill(0) }; // тоже в Young Generation
}

// После выхода из функции obj1 и obj2 становятся мусором и очищаются GC.


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4😁3🔥2
🤔 Что такое ORM?

Это технология для работы с базами данных, преобразующая данные между объектами приложения и реляционной БД.
1. Упрощает выполнение CRUD-операций без написания SQL-запросов.
2. Примеры: Entity Framework, Hibernate, SQLAlchemy.


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

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

🚩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()}`);
});


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

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

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

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

🚩Основные проблемы

🟠Гонки данных (Race Conditions)
Проблема: Два или более потоков пытаются одновременно изменить общие данные или один поток читает данные во время их изменения другим потоком, что приводит к непредсказуемым результатам.
Решение: Использование механизмов синхронизации, таких как блокировки (locks), мьютексы (mutexes) и семафоры (semaphores), для контроля доступа к общим ресурсам.

🟠Взаимная блокировка (Deadlock)
Проблема: Два или более потоков бесконечно ожидают ресурсы, заблокированные друг другом, в результате чего они не могут продолжить выполнение.
Решение: Разработка программы таким образом, чтобы потоки запрашивали ресурсы всегда в одном и том же порядке, использование таймаутов для блокировок, чтобы потоки могли выйти из состояния ожидания.

🟠Голодание (Starvation)
Проблема: Один или несколько потоков не могут получить доступ к необходимым ресурсам, потому что другие потоки постоянно занимают их.
Решение: Применение справедливых блокировок (fair locks) или алгоритмов планирования, которые обеспечивают всем потокам равный доступ к ресурсам.

🟠Переключение контекста (Context Switching)
Проблема: Частое переключение контекста между потоками может значительно снизить производительность системы, особенно если потоки часто блокируются и разблокируются.
Решение: Оптимизация количества потоков, уменьшение зависимостей между потоками и уменьшение использования блокировок.

🟠Проблемы с проектированием
Проблема: Неправильное проектирование многопоточной архитектуры может привести к сложностям в поддержке и расширении программного обеспечения.
Решение: Использование абстракций высокого уровня для работы с потоками, таких как пулы потоков, параллельные библиотеки (например, TPL в .NET) и модели акторов.

private static readonly object _lock = new object();
private static int _sharedResource;

public static void UpdateResource()
{
lock (_lock)
{
_sharedResource++;
// Выполнение некоторой работы с общим ресурсом
}
}


Избегание взаимной блокировки
private static readonly object _lock1

= new object();
private static readonly object _lock2 = new object();

public static void Method1()
{
lock (_lock1)
{
// Некоторые действия
lock (_lock2)
{
// Дополнительные действия
}
}
}

public static void Method2()
{
lock (_lock1)
{
// Аналогичные действия
lock (_lock2)
{
// Дополнительные действия
}
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
🤔 Пример паттерна Строитель?

Например, при создании объекта типа "Отчёт":
- У объекта много параметров (заголовок, дата, содержимое, автор, таблицы).
- С помощью билдера можно поочерёдно вызывать методы SetTitle(), SetContent(), SetFooter() и получить готовый объект методом Build().
Этот подход улучшает читаемость и гибкость кода.


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

Redis и Memcached являются популярными решениями для кэширования данных в памяти, что помогает ускорить доступ к данным и снизить нагрузку на базы данных в высоконагруженных системах. Обе системы часто используются для улучшения производительности веб-приложений и масштабируемых систем. Несмотря на общую цель, они имеют ряд различий в функциональности, производительности и подходах к управлению данными.

🚩Основные характеристики и различия

🟠Типы данных
Redis поддерживает разнообразные типы данных, такие как строки, списки, множества, отсортированные множества, хеши и битовые карты. Это расширяет возможности использования Redis для различных сценариев, таких как реализация очередей, стеков, сложных структур данных и подсчёт уникальных элементов.
Memcached поддерживает только

🟠Поддержка долговременной персистентности
Redis предлагает настраиваемые опции для долговременного хранения данных (персистентности), включая снимки состояния всей базы данных (snapshotting) и журналирование транзакций с предварительной записью (AOF, Append-Only File). Это позволяет восстанавливать состояние базы данных после перезагрузки системы.
Memcached не предлагает встроенных средств для персистентного хранения данных. По завершении работы процесса данные теряются, что делает его идеальным для временных и не очень важных данных, которые могут быть легко воссозданы или восстановлены.

🟠Распределение и масштабирование
Redis поддерживает различные модели распределения, включая шардинг (разделение данных на части по разным узлам) и репликацию. Это позволяет масштабировать Redis горизонтально и увеличивать его отказоустойчивость.
Memcached также поддерживает горизонтальное масштабирование и распределение данных с использованием простого алгоритма хэширования. Однако у него нет встроенной поддержки репликации или других продвинутых механизмов распределения, которые обеспечивают высокую доступность.

🟠Дополнительные возможности
Redis предлагает дополнительные возможности, такие как выполнение Lua-скриптов на стороне сервера, что позволяет пользователям реализовывать сложную логику обработки данных непосредственно в Redis. Кроме того, Redis поддерживает публикацию и подписку на каналы событий.
Memcached имеет более ограниченный набор функций, сосредоточенных вокруг основной задачи кэширования, и не поддерживает скриптинг или публикацию/подписку.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🤔2👾2🔥1
🤔 Какие типы связей известны у 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