uk
Feedback

Не попадись на ботовода! Telemetrio знаходить і позначає такі канали мітками 👉 Хочеш бачити мітку, оформляй підписку

C# | Вопросы собесов

C# | Вопросы собесов

Відкрити в Telegram

Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @sendme_ads

Показати більше
5 013
Підписники
-224 години
-17 днів
+2130 днів
Архів дописів
🤔 Как работает асинхронный метод? Асинхронный метод: - выполняется без блокировки основного потока; - использует ключевое слово async и возвращает Task/Task<T>; - может приостанавливаться на await и продолжаться после завершения асинхронной операции. Это позволяет эффективно использовать ресурсы и обрабатывать I/O без блокировок. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

В турагентство на удаленку требуются стажеры Клиентов предоставим. Можно без опыта и совмещая с основной работой или декретом. С нас обучение с гарантированной стажировкой. Доход после обучения: от 50 000₽ до 220 000₽. Оплата в процессе обучения зависит от вашей вовлеченности. Задачи: Помогать людям организовывать путешествия: подбор самых выгодных предложений на отдых со скидкой до 50% в новых сервисах бронирования. Условия: ✅ Без опыта — обучение с нуля за 2 месяца, первые выплаты в среднем в течение 2 недель; ✅Удаленная работа или совмещение с офисом (по желанию, зависит от вашего города). Хотите проверить, подойдет ли это вам? Регистрируйтесь на бесплатный вводный урок, на котором узнаете: — как подбирать туры для себя и близких с выгодой до 40% — как получать комиссию 7-10% с каждого тура. Узнать больше #реклама 16+ via-tourism-school.space О рекламодателе

🤔 В чем отличие dispose и finalize? Dispose и Finalize являются двумя механизмами для управления ресурсами, особенно теми, которые не управляются средой выполнения .NET, такими как файловые дескрипторы или соединения с базой данных. Они играют важную роль в освобождении ресурсов, но работают по-разному. 🚩Finalize Можно переопределить в классе для выполнения очистки ресурсов перед тем, как объект будет собран сборщиком мусора. Этот метод вызывается сборщиком мусора автоматически, если объект уничтожается и не имеет других живых ссылок. 🚩Dispose Является частью интерфейса IDisposable и предоставляет явный способ освобождения управляемых и неуправляемых ресурсов. Разработчики могут вызывать Dispose вручную или использовать конструкцию using, которая гарантирует вызов Dispose по завершении блока кода.
public class ResourceHolder : IDisposable
{
    private bool disposed = false;

    ~ResourceHolder() // Финализатор
    {
        Dispose(false);
    }

    public void Dispose() // Метод Dispose из IDisposable
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

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

            // Освобождение неуправляемых ресурсов
            disposed = true;
        }
    }
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Как работает async/await? async/await — это механизм для асинхронного программирования, позволяющий писать асинхронный код, который выглядит как синхронный. Ключевое слово async указывает, что метод может содержать await, который приостанавливает выполнение до завершения задачи. Во время ожидания поток освобождается для других операций, что повышает производительность. После завершения задачи выполнение метода возобновляется с того же места. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое индексы, какие типы бывают, использовал ли их на практике? Это структуры данных, которые улучшают скорость операций выборки данных, но могут снижать производительность операций вставки, удаления и обновления из-за необходимости поддержания индекса в актуальном состоянии. Могут быть построены на одном или нескольких столбцах таблицы и позволяют быстро находить строки без необходимости сканирования всей таблицы. 🚩Типы 🟠Одиночные индексы (Single-column indexes) Индексируют значения одного столбца таблицы. Это основной тип индекса, используемый для ускорения запросов, фильтрующих или сортирующих данные по одному столбцу. 🟠Составные индексы (Composite indexes) Индексируют значения, основанные на нескольких столбцах. Они полезны, когда операции выборки, сортировки или объединения таблиц часто используют одни и те же комбинации столбцов. 🟠Уникальные индексы (Unique indexes) Гарантируют, что индексируемые значения уникальны. Они часто используются для обеспечения уникальности столбцов или набора столбцов в таблице. 🟠Полнотекстовые индексы (Full-text indexes) Позволяют проводить полнотекстовый поиск по текстовым данным в базе данных. Они оптимизированы для поиска слов в больших текстовых полях и часто используются в системах, где требуется поиск по содержимому статей, блогов и других текстовых документов. 🟠Пространственные индексы (Spatial indexes) Используются для индексации пространственных данных, таких как географические объекты. Они оптимизируют запросы, включающие пространственные операции, такие как нахождение объектов внутри заданной области. 🚩Осмысленное использование 🟠Анализ запросов Использование индексов должно начинаться с анализа наиболее часто выполняемых запросов и понимания структуры данных. Профилирование и анализ планов выполнения запросов помогут определить, где индексы могут быть полезны. 🟠Сбалансированное использование Несмотря на преимущества ускорения чтения, индексы добавляют накладные расходы на операции записи. Каждая операция вставки, удаления или изменения данных требует обновления индексов, что может замедлить эти операции. 🟠Обслуживание индексов С течением времени индексы могут фрагментироваться, особенно в активно изменяемых базах данных. Регулярное обслуживание, такое как реорганизация и перестроение индексов, помогает поддерживать их производительность на оптимальном уровне. Ставь 👍 и забирай 📚 Базу знаний

🤔 Как используется ключевое слово await? Ключевое слово await используется для приостановки выполнения метода до завершения асинхронной задачи. Оно позволяет освобождать текущий поток и возвращается к коду после завершения задачи. await применяется в асинхронных методах, объявленных с помощью async. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Расскажи про конкурентные коллекции? Конкурентные коллекции — это специализированные коллекции, которые обеспечивают безопасное выполнение операций в многопоточной среде. В стандартной библиотеке .NET существуют несколько типов таких коллекций, каждая из которых предназначена для различных сценариев использования. Давайте рассмотрим основные из них. 🟠ConcurrentDictionary<TKey, TValue> Это словарь, который позволяет безопасно добавлять, удалять и изменять элементы из нескольких потоков одновременно. Он реализует интерфейс IDictionary<TKey, TValue>.
var concurrentDictionary = new ConcurrentDictionary<int, string>();
concurrentDictionary.TryAdd(1, "value1");
concurrentDictionary.TryAdd(2, "value2");

string value;
if (concurrentDictionary.TryGetValue(1, out value))
{
    Console.WriteLine(value);  // Output: value1
}
🟠ConcurrentQueue<T> Это очередь, которая обеспечивает безопасное добавление элементов в конец и извлечение из начала в многопоточной среде. Она реализует интерфейс IProducerConsumerCollection<T>.
var concurrentQueue = new ConcurrentQueue<int>();
concurrentQueue.Enqueue(1);
concurrentQueue.Enqueue(2);

int result;
if (concurrentQueue.TryDequeue(out result))
{
    Console.WriteLine(result);  // Output: 1
}
🟠ConcurrentStack<T> Это стек, который обеспечивает безопасное добавление и извлечение элементов в многопоточной среде. Он также реализует интерфейс IProducerConsumerCollection<T>.
var concurrentStack = new ConcurrentStack<int>();
concurrentStack.Push(1);
concurrentStack.Push(2);

int result;
if (concurrentStack.TryPop(out result))
{
    Console.WriteLine(result);  // Output: 2
}
🟠ConcurrentBag<T> Это коллекция, которая позволяет безопасно добавлять и извлекать элементы в многопоточной среде. Она не гарантирует порядок элементов, поэтому используется в случаях, когда порядок не имеет значения.
var concurrentBag = new ConcurrentBag<int>();
concurrentBag.Add(1);
concurrentBag.Add(2);

int result;
if (concurrentBag.TryTake(out result))
{
    Console.WriteLine(result);  // Output: 1 или 2
}
🟠BlockingCollection<T> Это коллекция, которая поддерживает ограниченную емкость и блокировку потоков при добавлении или извлечении элементов. Она особенно полезна для реализации паттернов продюсер-потребитель.
var blockingCollection = new BlockingCollection<int>(boundedCapacity: 5);
Task.Run(() =>
{
    for (int i = 0; i < 10; i++)
    {
        blockingCollection.Add(i);
        Console.WriteLine($"Added {i}");
    }
    blockingCollection.CompleteAdding();
});

foreach (var item in blockingCollection.GetConsumingEnumerable())
{
    Console.WriteLine($"Consumed {item}");
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое IEnumerable? IEnumerable — это интерфейс в .NET для перебора коллекций с помощью цикла foreach. Он предоставляет метод GetEnumerator, возвращающий объект, позволяющий обходить элементы коллекции по одному. Это основа для работы с последовательностями в LINQ и других структурах данных. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Айтишники, это вам — в телеграм есть комьюнити по каждому направлению в IT Там есть буквально всё: чаты для общения, тонны ма
Айтишники, это вам — в телеграм есть комьюнити по каждому направлению в IT Там есть буквально всё: чаты для общения, тонны материала(книги, курсы, ресурсы и гайды), свежие новости и конечно же мемы Выбирайте своё направление: 💩 Frontend 🐍 Python 🐧 Linux 👩‍💻 С/С++ 👩‍💻 C# 🤔 Хакинг & ИБ 📱 GitHub 🖥 SQL 👩‍💻 Сисадмин 🤟 DevOps ⚙️ Backend 🖥 Data Science 🧑‍💻 Java 🐞 Тестирование 🖥 PM / PdM 👩‍💻 GameDev 🧑‍💻 Golang 👣 Rust 🧑‍💻 PHP 💻 WebDev 🖥 Моб. Dev 🖥Анали.(SA&BA) 👩‍💻 Дизайн 🖥 Нейросети 💛 1C 🤓 Книги IT ➡️ Сохраняйте в закладки

🤔 Что такое инверсия зависимостей? Инверсия зависимостей — это принцип SOLID, который говорит: > Модули верхнего уровня не должны зависеть от модулей нижнего уровня. Оба должны зависеть от абстракций. Это значит, что вместо жёстких зависимостей на конкретные классы, код должен работать через абстракции (interface или abstract class). 🚩Проблема без инверсии зависимостей Допустим, у нас есть класс EmailSender, который отправляет письма:
public class EmailSender
{
    public void Send(string message)
    {
        Console.WriteLine($"Отправка email: {message}");
    }
}

public class NotificationService
{
    private EmailSender _emailSender = new EmailSender();

    public void Notify(string message)
    {
        _emailSender.Send(message);
    }
}
🚩Решение: Инверсия зависимостей Чтобы избавиться от жёсткой зависимости, вводим абстракцию (IMessageSender):
public interface IMessageSender
{
    void Send(string message);
}

public class EmailSender : IMessageSender
{
    public void Send(string message)
    {
        Console.WriteLine($"Отправка email: {message}");
    }
}

public class SmsSender : IMessageSender
{
    public void Send(string message)
    {
        Console.WriteLine($"Отправка SMS: {message}");
    }
}
Теперь NotificationService зависит не от конкретного класса, а от интерфейса:
public class NotificationService
{
    private readonly IMessageSender _messageSender;

    public NotificationService(IMessageSender messageSender)
    {
        _messageSender = messageSender;
    }

    public void Notify(string message)
    {
        _messageSender.Send(message);
    }
}
Теперь мы можем подставлять любую реализацию IMessageSender:
var emailNotifier = new NotificationService(new EmailSender());
emailNotifier.Notify("Привет через Email!");

var smsNotifier = new NotificationService(new SmsSender());
smsNotifier.Notify("Привет через SMS!");
Вывод
Отправка email: Привет через Email!
Отправка SMS: Привет через SMS!
🚩Преимущества инверсии зависимостей Гибкость – можно легко заменять зависимости. Тестируемость – можно подставить Mock-объект вместо EmailSender. Меньше изменений в коде – можно добавить новые способы отправки сообщений без изменения NotificationService. Ставь 👍 и забирай 📚 Базу знаний

🤔 Какие кучи существуют? - Small Object Heap (SOH): Для объектов небольшого размера. - Large Object Heap (LOH): Для больших объектов (например, массивов размером более 85 КБ). - Pinned Heap: Для объектов с фиксированным расположением в памяти (например, для взаимодействия с unmanaged-кодом). Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое carbage collector? Garbage Collector (GC)** — это автоматический механизм управления памятью в .NET, который освобождает неиспользуемые объекты, предотвращая утечки памяти. 🚩Как работает GC? 🟠Объекты создаются в управляемой памяти (Heap) Когда мы создаём объект
var obj = new object();
🟠Когда объект больше не нужен, GC его удаляет Если на объект больше нет ссылок, он становится "мусором" и может быть удалён
void Test()
{
    var obj = new object(); // Создали объект
} // obj выходит из области видимости -> GC может его удалить
🚩Поколения GC (Generations) GC в .NET использует поколения (Generations), чтобы ускорить сборку мусора: 🚩Принудительный вызов GC (нежелательно) Обычно GC работает автоматически, но можно вызвать его вручную:
GC.Collect(); // Принудительный запуск GC (используйте осторожно!)
🚩Как уменьшить нагрузку на GC? Использовать using для очистки ресурсов:
using (var file = new StreamWriter("file.txt"))
{
    file.WriteLine("Hello, world!");
} // Файл автоматически закроется
Реализовать IDisposable для освобождения ресурсов вручную:
public class MyResource : IDisposable
{
    public void Dispose()
    {
        Console.WriteLine("Ресурс освобождён");
    }
}

using (var resource = new MyResource())
{
    // Используем ресурс
} // Вызовется Dispose()
Избегать ненужных ссылок – если переменная больше не нужна, лучше обнулять её
obj = null;
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое тесные связи между объектами? Тесные связи возникают, когда объекты сильно зависят друг от друга, например: 1. Один объект использует конкретные методы или структуры другого. 2. Изменение одного объекта требует изменения другого. Это затрудняет поддержку и тестирование кода. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤖 Знаете, чем настоящий AI отличается от чат-бота? Чат-бот просит перезагрузить роутер, а настоящий AI уже умеет читать ваши
🤖 Знаете, чем настоящий AI отличается от чат-бота? Чат-бот просит перезагрузить роутер, а настоящий AI уже умеет читать ваши эмоции в чате, включать музыку под ваше настроение, контролировать погрузку руды с точностью Терминатора и даже находить на КТ-снимках то, чего не заметит человеческий глаз. Современные компании для таких задач всё чаще используют Deep Learning — алгоритмы на основе нейросетей. Но чтобы попасть в эту лигу, нужен фундамент. И имя ему — Machine Learning. Наш новый курс по ML — это не волшебная таблетка. Это честный и структурированный путь в мир Data Science. Мы дадим вам базу, с которой вы: ✅ разберётесь, как мыслят машины (спойлер: матрицами!); ✅ научитесь строить работающие модели, а не карточные домики; ✅ получите трамплин для прыжка в Deep Learning. Хватит смотреть, как другие запускают ракеты. Пора строить свой собственный космодром. Начните с фундамента на нашем курсе по Machine Learning

🤔 Что такое медиатор? Это паттерн проектирования поведенческих шаблонов, который позволяет уменьшить связанность между объектами, обеспечивая взаимодействие через центральный объект-посредник. Медиатор упрощает коммуникацию между компонентами системы, делая ее более модульной и легкой для сопровождения. 🚩Примеры использования 1⃣Определение интерфейса медиатора
public interface IMediator
{
    void Notify(object sender, string ev);
}   
2⃣Реализация медиатора
public class DialogMediator : IMediator
{
    private Button _button;
    private TextBox _textBox;

    public DialogMediator(Button button, TextBox textBox)
    {
        _button = button;
        _button.SetMediator(this);
        _textBox = textBox;
        _textBox.SetMediator(this);
    }

    public void Notify(object sender, string ev)
    {
        if (ev == "ButtonClick")
        {
            _textBox.Clear();
        }
        else if (ev == "TextBoxEnter")
        {
            _button.SetEnabled(true);
        }
    }
}   
3⃣Компоненты, взаимодействующие через медиатора
public class Button
{
    private IMediator _mediator;
       
    public void SetMediator(IMediator mediator)
    {
        _mediator = mediator;
    }

    public void Click()
    {
        Console.WriteLine("Button clicked");
        _mediator.Notify(this, "ButtonClick");
    }

    public void SetEnabled(bool enabled)
    {
        Console.WriteLine($"Button is {(enabled ? "enabled" : "disabled")}");
    }
}

public class TextBox
{
    private IMediator _mediator;
       
    public void SetMediator(IMediator mediator)
    {
        _mediator = mediator;
    }

    public void EnterText()
    {
        Console.WriteLine("Text entered");
        _mediator.Notify(this, "TextBoxEnter");
    }

    public void Clear()
    {
        Console.WriteLine("TextBox cleared");
    }
}  
4⃣Использование медиатора в приложении
var button = new Button();
var textBox = new TextBox();
var mediator = new DialogMediator(button, textBox);

textBox.EnterText(); // Ввод текста активирует кнопку
button.Click();      // Нажатие кнопки очищает текстовое поле   
🚩Плюсы и минусы ➕Снижение связанности Компоненты не взаимодействуют напрямую, а используют медиатор. ➕Упрощение поддержки Вся логика взаимодействия сосредоточена в одном месте. ➕Повышение модульности Легко добавлять новые компоненты или изменять существующие. ➖Усложнение медиатора Медиатор может стать сложным, если в него добавляется много логики. ➖Единая точка отказа Если медиатор выходит из строя, это может повлиять на всю систему. Ставь 👍 и забирай 📚 Базу знаний

⚡️Готовиться к собеседованиям стало проще! Женя Янченко, backend-dev и руководитель разработки, cделала конспекты самой попул
⚡️Готовиться к собеседованиям стало проще! Женя Янченко, backend-dev и руководитель разработки, cделала конспекты самой популярной книги по архитектуре систем — «Высоконагруженные приложения» Мартина Клеппмана (книга с кабанчиком). Подробные разборы репликации, шардирования, транзакций: ▶️ ЧИТАТЬ КОНСПЕКТ КАБАНЧИКА В канале Женя разбирает и другие технические темы, особенно те, которые могут пригодиться на собесе по system design: 🟡 CAP-теорема простыми словами 🟡 Сравнение Kafka и RabbitMQ 🟡 API Gateway 🟡 Load Balancer А как же алгоритмы? Они тоже есть! В феврале Женя объявила челлендж — решить 300 задач за год 😱 и недавно стала делать разборы популярных задач: 🟡Разбор паттерна "Два указателя" Истории из опыта, рекомендации и ответы на вопросы: 🟡«Ты не оправдываешь ожиданий» и что с этим делать 🟡Про манипуляции менеджеров 🟡Как я боролась с неуверенностью в себе 🟡«Просто нажми кнопку» или история одного релиза 📝 и ещё 100+ полезных технических и жизненных постов. Подписывайтесь, чтобы не потерять полезный канал @jane_yanchenko

Современный лидер похож на мастера кунг-фу Он должен одинаково круто проводить рабочие встречи, делегировать задачи, вдохновл
Современный лидер похож на мастера кунг-фу Он должен одинаково круто проводить рабочие встречи, делегировать задачи, вдохновлять сотрудников, быть медиатором в конфликтных ситуациях. И при этом не забывать про масштабные цели и развитие бизнеса! Чтобы не выгорать и сохранять баланс, важно развивать навыки руководителя. Поэтому в бизнес-медиа банка Точка Справочной собрали подборку из 5 лекций. Каждая поможет из начальника превратиться в лидера, ведущего за собой. Лекторы – спикеры из крупного бизнеса и успешных агентств по работе с командами. Доступ к лекциям бесплатный, можно слушать в удобном порядке или открывать только интересные вам темы. Смотреть #реклама 16+ allo-special.tochka.com О рекламодателе

🤔 Чем Dictionary отличается от ConcurrentDictionary? - Dictionary — не потокобезопасен, может выдавать исключения при одновременном доступе из разных потоков. - ConcurrentDictionary — потокобезопасная коллекция, позволяет безопасно читать и изменять данные в многопоточном окружении без внешней синхронизации. Используется в системах, где возможны параллельные обращения к структуре. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое 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
Ставь 👍 и забирай 📚 Базу знаний

🤔 Два подхода проектирования баз данных и кода 1. Code First: - Сначала пишется модель в коде (Entity, классы). - Потом генерируется схема БД. - Гибкий, удобен для разработчиков. 2. Database First: - Сначала создаётся база данных, таблицы, связи. - Генерируются классы по схеме. - Используется, когда БД уже существует или управляется отдельно. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний