C# | Вопросы собесов
Відкрити в Telegram
Cайт easyoffer.ru Реклама @easyoffer_adv ВП @easyoffer_vp Тесты t.me/+nebTPWgpeGs1OWFi Задачи t.me/+Xy-0H7xKlgo0NDVi Вакансии t.me/+BQFHXZQ0zrViNGIy
Показати більше5 049
Підписники
+324 години
-147 днів
-2630 день
Архів дописів
5 048
🤔 Что такое Redis?
Это система управления базами данных с открытым исходным кодом, работающая в памяти и поддерживающая множество типов данных, таких как строки, списки, множества, хеши и другие. Redis часто используется как кэш, брокер сообщений и база данных. Он известен своей высокой производительностью, низкой задержкой и простотой в использовании.
🚩Особенности
🟠Работа в памяти
Redis хранит все данные в памяти, что обеспечивает очень быструю скорость чтения и записи. Данные также могут периодически сохраняться на диск для обеспечения долговечности.
🟠Поддержка различных типов данных
Строки (Strings): Самый простой тип данных в Redis, который может содержать текст или двоичные данные.
Списки (Lists): Упорядоченные коллекции строк, которые можно использовать как очереди или стеки.
Множества (Sets): Неупорядоченные коллекции уникальных строк.
Упорядоченные множества (Sorted Sets): Коллекции уникальных строк, каждая из которых связана с числовым значением (score), определяющим порядок.
Хеши (Hashes): Коллекции пар "ключ-значение", где каждый хеш связан с ключом.
Bitmaps и HyperLogLogs: Для эффективного хранения и обработки больших объемов данных.
🟠Высокая производительность
Благодаря хранению данных в памяти и простому протоколу клиент-сервер, Redis обеспечивает очень высокую скорость операций.
🟠Поддержка репликации
Redis поддерживает мастер-слейв репликацию, что позволяет создать резервные копии данных и обеспечить отказоустойчивость.
🟠Кластеризация
Redis Cluster позволяет распределить данные по нескольким узлам, обеспечивая горизонтальную масштабируемость.
🟠Поддержка Lua-скриптов
Redis позволяет выполнять атомарные операции с помощью Lua-скриптов.
🟠Транзакции
Redis поддерживает транзакции, позволяя выполнить несколько команд атомарно.
🚩Примеры использования
🟠Кэширование
Redis часто используется для кэширования данных, что позволяет значительно уменьшить задержку доступа и снизить нагрузку на базу данных.
using StackExchange.Redis;
using System;
class Program
{
static void Main()
{
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");
IDatabase db = redis.GetDatabase();
db.StringSet("key", "value");
string value = db.StringGet("key");
Console.WriteLine(value);
}
}
🟠Сессии
Хранение сессий пользователя для веб-приложений, что обеспечивает быстрое и эффективное управление состоянием.
🟠Очереди сообщений
Использование списков или упорядоченных множеств для организации очередей сообщений.
using StackExchange.Redis;
using System;
class Program
{
static void Main()
{
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");
IDatabase db = redis.GetDatabase();
db.ListLeftPush("queue", "task1");
db.ListLeftPush("queue", "task2");
string task = db.ListRightPop("queue");
Console.WriteLine(task);
}
}
🟠Счетчики и рейтинги
Использование упорядоченных множеств для реализации счетчиков, рейтингов или систем рекомендаций.
using StackExchange.Redis;
using System;
class Program
{
static void Main()
{
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");
IDatabase db = redis.GetDatabase();
// Add scores for users
db.SortedSetAdd("scores", "user1", 100);
db.SortedSetAdd("scores", "user2", 200);
// Retrieve scores with scores included
var scores = db.SortedSetRangeByRankWithScores("scores", 0, -1);
foreach (var score in scores)
{
Console.WriteLine($"{score.Element}: {score.Score}");
}
}
}
Ставь 👍 и забирай 📚 Базу знаний5 048
Дарим подписку Mail Space на 1 ТБ на 3 летних месяца.
У вас будет 1 ТБ для любых файлов, а еще безлимит — это когда фото и видео с телефона не занимают место в Облаке. Можете фоткать всё, что угодно и не переживать, что место закончится. Не закончится. Совсем. Даже на 1 000 001 фото летней вечеринки.
Забрать подарок
Узнать больше
#реклама 16+
cloud.mail.ru
О рекламодателе
5 048
🤔 Что такое deadlock?
Deadlock — это ситуация, когда два или более потока заблокированы, каждый из них ждёт ресурс, занятый другим, и в результате никто не может продолжить работу. Система зацикливается и зависает. Такое часто происходит при неправильной последовательности захвата ресурсов.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 048
🤔 Чем отличается ссылочный и значимый тип?
В C# все типы делятся на значимые (value types) и ссылочные (reference types). Основное различие заключается в том, как данные хранятся в памяти и как передаются в методы.
🚩Значимые типы (Value Types)
Хранятся в стеке (Stack).
Передаются по значению (копируются).
Каждый объект имеет свою копию данных.
Не могут быть
null (если не использовать Nullable<T>).
🚩Примеры значимых типов:
- int, double, bool, char
- struct, enum, DateTime
int a = 10;
int b = a; // Копия значения
b = 20;
Console.WriteLine(a); // 10 (не изменился)
Console.WriteLine(b); // 20
🚩Ссылочные типы (Reference Types)
Хранятся в куче (Heap), а в стеке лежит ссылка на объект.
Передаются по ссылке (не копируются, а передаётся адрес).
Несколько переменных могут указывать на один и тот же объект.
Могут быть null (если не инициализированы).
class Person
{
public string Name;
}
Person p1 = new Person { Name = "Alice" };
Person p2 = p1; // p2 и p1 указывают на один объект
p2.Name = "Bob";
Console.WriteLine(p1.Name); // Bob (изменилось!)
Console.WriteLine(p2.Name); // Bob
Ставь 👍 и забирай 📚 Базу знаний5 048
🤔 Что такое делегат?
Делегат в C# — это тип, который представляет ссылки на методы с определённой сигнатурой. Делегаты используются для передачи методов в качестве параметров и для обратных вызовов (callbacks). Они являются основой для событий и лямбда-выражений в C#. Делегаты позволяют вызывать методы динамически, что делает код более гибким.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 048
🤔 В чем разница Redis и memcache`а?
Redis и Memcached являются популярными решениями для кэширования данных в памяти, что помогает ускорить доступ к данным и снизить нагрузку на базы данных в высоконагруженных системах. Обе системы часто используются для улучшения производительности веб-приложений и масштабируемых систем. Несмотря на общую цель, они имеют ряд различий в функциональности, производительности и подходах к управлению данными.
🚩Основные характеристики и различия
🟠Типы данных
Redis поддерживает разнообразные типы данных, такие как строки, списки, множества, отсортированные множества, хеши и битовые карты. Это расширяет возможности использования Redis для различных сценариев, таких как реализация очередей, стеков, сложных структур данных и подсчёт уникальных элементов.
Memcached поддерживает только
🟠Поддержка долговременной персистентности
Redis предлагает настраиваемые опции для долговременного хранения данных (персистентности), включая снимки состояния всей базы данных (snapshotting) и журналирование транзакций с предварительной записью (AOF, Append-Only File). Это позволяет восстанавливать состояние базы данных после перезагрузки системы.
Memcached не предлагает встроенных средств для персистентного хранения данных. По завершении работы процесса данные теряются, что делает его идеальным для временных и не очень важных данных, которые могут быть легко воссозданы или восстановлены.
🟠Распределение и масштабирование
Redis поддерживает различные модели распределения, включая шардинг (разделение данных на части по разным узлам) и репликацию. Это позволяет масштабировать Redis горизонтально и увеличивать его отказоустойчивость.
Memcached также поддерживает горизонтальное масштабирование и распределение данных с использованием простого алгоритма хэширования. Однако у него нет встроенной поддержки репликации или других продвинутых механизмов распределения, которые обеспечивают высокую доступность.
🟠Дополнительные возможности
Redis предлагает дополнительные возможности, такие как выполнение Lua-скриптов на стороне сервера, что позволяет пользователям реализовывать сложную логику обработки данных непосредственно в Redis. Кроме того, Redis поддерживает публикацию и подписку на каналы событий.
Memcached имеет более ограниченный набор функций, сосредоточенных вокруг основной задачи кэширования, и не поддерживает скриптинг или публикацию/подписку.
Ставь 👍 и забирай 📚 Базу знаний
5 048
🤔 Пример выполнения кода, когда возвращается объект интерфейса IQueryable?
Особенности:
- Метод возвращает IQueryable, что означает отложенное выполнение.
- Запрос не выполняется сразу, пока не будет перечислен (ToList(), Count() и т.д.).
- Это позволяет накапливать фильтры и выполнять один оптимизированный SQL-запрос.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 048
🤔 Если в двух переменных хранится одинаковое значение, то будут ли они равны?
Сравнение значений переменных может зависеть от типа данных, хранящихся в этих переменных, и от способа их сравнения.
🟠Примитивные типы (Value Types)
Для примитивных типов (например,
int, float, char, bool) значение хранятся непосредственно в переменных, и их сравнение выполняется по значению.
int a = 5;
int b = 5;
bool areEqual = (a == b); // True
🟠Ссылочные типы (Reference Types)
Для ссылочных типов (например, классы, строки) переменные содержат ссылки на объекты в куче. Сравнение ссылочных типов по умолчанию выполняется по ссылке, а не по значению.
class Person
{
public string Name { get; set; }
}
Person person1 = new Person { Name = "Alice" };
Person person2 = new Person { Name = "Alice" };
bool areEqual = (person1 == person2); // False, потому что сравниваются ссылки
🟠Строки (Strings)
Строки являются ссылочными типами, но переопределяют операторы сравнения == и Equals для сравнения по значению.
string str1 = "Hello";
string str2 = "Hello";
bool areEqual = (str1 == str2); // True, строки сравниваются по значению
🟠Кастомные классы
Для кастомных классов можно переопределить методы Equals и GetHashCode, чтобы сравнивать объекты по значению.
class Person
{
public string Name { get; set; }
public override bool Equals(object obj)
{
if (obj == null || GetType() != obj.GetType())
return false;
Person other = (Person)obj;
return Name == other.Name;
}
public override int GetHashCode()
{
return Name.GetHashCode();
}
}
Person person1 = new Person { Name = "Alice" };
Person person2 = new Person { Name = "Alice" };
bool areEqual = person1.Equals(person2); // True
Ставь 👍 и забирай 📚 Базу знаний5 048
🤔 Какие есть базовые сущности RabbitMQ?
1. Queue — очередь, куда отправляются сообщения.
2. Exchange — точка обмена, которая направляет сообщения в очереди на основе правил.
3. Binding — связь между Exchange и Queue, определяющая, какие сообщения попадут в очередь.
4. Message — само сообщение, отправляемое в RabbitMQ.
5. Connection — соединение клиента с сервером RabbitMQ.
6. Channel — виртуальный канал поверх соединения для работы с сообщениями.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 048
🤔 Что такое примитив синхронзиации 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 048
🤔 Как работает Entity Framework?
Entity Framework — это ORM (Object-Relational Mapping) фреймворк для .NET, который позволяет разработчикам взаимодействовать с базой данных с помощью объектно-ориентированных моделей. Это упрощает работу с данными, автоматизируя задачи создания SQL-запросов и обработки данных.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 048
🤔 Строки - значимый или ссылочный тип?
В C# строки (
string) являются ссылочным типом, но ведут себя как значимый тип из-за своей неизменяемости (immutability).
🚩`string` – это ссылочный тип
В C# все классы (class) – ссылочные типы, и string не исключение.
- Переменная string хранит ссылку на объект в памяти, а не сам текст.
- Две переменные могут ссылаться на один и тот же объект.
string str1 = "Hello";
string str2 = str1; // str2 теперь указывает на тот же объект, что и str1
Console.WriteLine(object.ReferenceEquals(str1, str2)); // True
🚩`string` – неизменяемый тип (Immutable)
Хотя string – ссылочный тип, каждое изменение строки создаёт новый объект в памяти, а не модифицирует существующий.
string str = "Hello";
str += " World"; // Создаётся новый объект в памяти
🚩Почему `string` ведёт себя как значимый тип?
Неизменяемость (Immutability) – строка не меняется после создания.
Операции со строками создают новые объекты (как копирование значимых типов).
Сравнение строк по значению (==), а не по ссылке (как у ссылочных типов). 1210
string s1 = "hello";
string s2 = "hello";
Console.WriteLine(s1 == s2); // True (сравниваются значения, а не ссылки)
Ставь 👍 и забирай 📚 Базу знаний5 048
🤔 Какие типы шаблонов проектирования есть?
C# поддерживает все классические шаблоны проектирования (по GoF), включая:
- Порождающие: Singleton, Factory Method, Abstract Factory, Builder, Prototype.
- Структурные: Adapter, Bridge, Composite, Decorator, Facade, Flyweight, Proxy.
- Поведенческие: Strategy, Observer, Command, State, Visitor, Mediator, Chain of Responsibility, Memento, Interpreter, Iterator, Template Method.
А также часто используются:
- Dependency Injection
- Repository
- Unit of Work
- MVVM (в WPF) и MVC (в ASP.NET)
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 048
🤔 Можно ли generic методы использовать не в generic классах?
Да, можно! Обобщённые (
generic) методы могут существовать в обычных (не-generic) классах.
🚩Как это работает?
Generic-метод — это метод, у которого тип параметра задаётся при вызове, даже если сам класс не является обобщённым.
Пример: Обобщённый метод в обычном классе
public class Utils
{
public static void Print<T>(T value) // Обобщённый метод
{
Console.WriteLine($"Тип: {typeof(T)}, Значение: {value}");
}
}
class Program
{
static void Main()
{
Utils.Print(100); // Тип: System.Int32, Значение: 100
Utils.Print("Hello"); // Тип: System.String, Значение: Hello
Utils.Print(3.14); // Тип: System.Double, Значение: 3.14
}
}
Ставь 👍 и забирай 📚 Базу знаний5 048
🤔 Как происходит работа с Thread-ами и Task-ами, если из нескольких обращаться к общему state?
При доступе к общему состоянию из нескольких Task или Thread могут возникнуть гонки данных (race conditions).
Чтобы избежать ошибок:
- Используют блокировки (lock, Monitor, Mutex).
- Применяют конкурентные коллекции (ConcurrentDictionary, BlockingCollection).
- Используют иммутабельность и локальные копии данных.
- В случае async/await — состояние можно защищать SemaphoreSlim.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 048
Теперь тебе не придется искать работу самому
Совсем скоро я анонсирую первого в России AI-ассистента для поиска работы. И у тебя будет шанс попробовать его бесплатно.
Все, что нужно будет сделать - это пройти короткий опрос про твой опыт работы и подключить ее к аккаунту на хэдхантере.
Дальше произойдет магия.
🔵Софи структурирует твой опыт в резюме и опишет его через результаты. А еще добавит ключевые слова и адаптирует резюме под вакансию.
🔵Она сама будет делать до 100 откликов в день, причем каждый отклик будет соответствовать твоему стеку, зарплатным ожиданиям и нужному формату работы.
🔵Софи будет писать сопроводительные письма для каждой компании, учитывая их ценности, боли и требования к сотрудникам.
🔵Ты больше не будешь узнавать про отказы от работодателей - Софи будет присылать только полезные апдейты по сделанным откликам.
🔵Как только ты получишь приглашение на собес, Софи найдет свободный слот в твоем календаре и запланирует встречу. А еще пришлет тебе описание компании, вакансии, вопросы которые могут задать и материалы по подготовке.
15 июля я проведу прямой эфир и открою бесплатный доступ к Софи для 350 человек. Сразу после мы закроем продажи на несколько недель.
Первые пользователи также получат 2 бонуса:
-3 месяца подписки за 14990 3500 рублей.
-Бесплатный доступ к тренажеру собеседований на 1 месяц.
15 июля. 350 мест.
Подпишись, чтобы не пропустить.
5 048
🤔 Что такое value-type?
Value Type (тип значения) – это тип данных, который хранит своё значение непосредственно в памяти (обычно в стеке), а не ссылку на объект в куче (heap), как это делает ссылочный тип (Reference Type).
🚩Какие типы данных являются Value Type?
Простые типы (
int, double, bool, char, byte, float, decimal, etc.)
Структуры (struct)
Перечисления (enum)
Nullable-значения (int?, double?)
🚩Пример Value Type
int a = 10;
int b = a; // Значение копируется
b = 20;
Console.WriteLine(a); // 10 (остался неизменным)
Console.WriteLine(b); // 20
🚩Где хранятся Value Type?
Value Type обычно хранятся в стеке (stack) – это быстрая область памяти.
Если структура (struct) является частью объекта (который хранится в куче), то её значение хранится внутри объекта в куче.
struct Point
{
public int X;
public int Y;
}
class Program
{
static void Main()
{
Point p1 = new Point { X = 5, Y = 10 };
Point p2 = p1; // Копирование структуры (создаётся новый экземпляр)
p2.X = 20;
Console.WriteLine(p1.X); // 5 (остался неизменным)
Console.WriteLine(p2.X); // 20
}
}
🚩Когда использовать Value Type?
Если данные небольшие и часто изменяются – struct
Если объект недолговечный и не требует сложного поведения
Если производительность важна – Value Type быстрее из-за работы в стеке
Ставь 👍 и забирай 📚 Базу знаний5 048
🤔 В чём разница между throw и throw ex?
- throw — повторно выбрасывает текущее исключение без потери стека вызовов.
- throw ex — создаёт новый бросок, обнуляя стек вызовов, и ты теряешь контекст, где ошибка возникла.
Используй просто throw, чтобы сохранить исходную точку ошибки.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 048
🤔 Если в двух переменных хранится одинаковое значение, то будут ли они равны?
Сравнение значений переменных может зависеть от типа данных, хранящихся в этих переменных, и от способа их сравнения.
🟠Примитивные типы (Value Types)
Для примитивных типов (например,
int, float, char, bool) значение хранятся непосредственно в переменных, и их сравнение выполняется по значению.
int a = 5;
int b = 5;
bool areEqual = (a == b); // True
🟠Ссылочные типы (Reference Types)
Для ссылочных типов (например, классы, строки) переменные содержат ссылки на объекты в куче. Сравнение ссылочных типов по умолчанию выполняется по ссылке, а не по значению.
class Person
{
public string Name { get; set; }
}
Person person1 = new Person { Name = "Alice" };
Person person2 = new Person { Name = "Alice" };
bool areEqual = (person1 == person2); // False, потому что сравниваются ссылки
🟠Строки (Strings)
Строки являются ссылочными типами, но переопределяют операторы сравнения == и Equals для сравнения по значению.
string str1 = "Hello";
string str2 = "Hello";
bool areEqual = (str1 == str2); // True, строки сравниваются по значению
🟠Кастомные классы
Для кастомных классов можно переопределить методы Equals и GetHashCode, чтобы сравнивать объекты по значению.
class Person
{
public string Name { get; set; }
public override bool Equals(object obj)
{
if (obj == null || GetType() != obj.GetType())
return false;
Person other = (Person)obj;
return Name == other.Name;
}
public override int GetHashCode()
{
return Name.GetHashCode();
}
}
Person person1 = new Person { Name = "Alice" };
Person person2 = new Person { Name = "Alice" };
bool areEqual = person1.Equals(person2); // True
Ставь 👍 и забирай 📚 Базу знаний5 048
🤔 В чём разница в загрузке данных между жадной, ленивой и явной?
- Жадная (Eager) загрузка — данные загружаются вместе с основным объектом сразу, обычно через Include. Это снижает количество запросов, но может привести к избытку данных.
- Ленивая (Lazy) загрузка — связанные данные подгружаются только при первом доступе к ним. Это удобно, но требует осторожности (можно случайно вызвать лишние запросы).
- Явная (Explicit) загрузка — данные подгружаются вручную при необходимости, через отдельный вызов. Такой подход даёт полный контроль, но требует больше кода.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Вже доступно! Дослідження Telegram за 2025 — головні інсайти року 
