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

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

Ir al canal en Telegram
5 047
Suscriptores
-824 horas
-137 días
-2330 días
Archivo de publicaciones
🤔 Что такое делегат? Делегат в C# — это тип, который представляет ссылки на методы с определённой сигнатурой. Делегаты используются для передачи методов в качестве параметров и для обратных вызовов (callbacks). Они являются основой для событий и лямбда-выражений в C#. Делегаты позволяют вызывать методы динамически, что делает код более гибким. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 В чем разница Redis и memcache`а? Redis и Memcached являются популярными решениями для кэширования данных в памяти, что помогает ускорить доступ к данным и снизить нагрузку на базы данных в высоконагруженных системах. Обе системы часто используются для улучшения производительности веб-приложений и масштабируемых систем. Несмотря на общую цель, они имеют ряд различий в функциональности, производительности и подходах к управлению данными. 🚩Основные характеристики и различия 🟠Типы данных Redis поддерживает разнообразные типы данных, такие как строки, списки, множества, отсортированные множества, хеши и битовые карты. Это расширяет возможности использования Redis для различных сценариев, таких как реализация очередей, стеков, сложных структур данных и подсчёт уникальных элементов. Memcached поддерживает только 🟠Поддержка долговременной персистентности Redis предлагает настраиваемые опции для долговременного хранения данных (персистентности), включая снимки состояния всей базы данных (snapshotting) и журналирование транзакций с предварительной записью (AOF, Append-Only File). Это позволяет восстанавливать состояние базы данных после перезагрузки системы. Memcached не предлагает встроенных средств для персистентного хранения данных. По завершении работы процесса данные теряются, что делает его идеальным для временных и не очень важных данных, которые могут быть легко воссозданы или восстановлены. 🟠Распределение и масштабирование Redis поддерживает различные модели распределения, включая шардинг (разделение данных на части по разным узлам) и репликацию. Это позволяет масштабировать Redis горизонтально и увеличивать его отказоустойчивость. Memcached также поддерживает горизонтальное масштабирование и распределение данных с использованием простого алгоритма хэширования. Однако у него нет встроенной поддержки репликации или других продвинутых механизмов распределения, которые обеспечивают высокую доступность. 🟠Дополнительные возможности Redis предлагает дополнительные возможности, такие как выполнение Lua-скриптов на стороне сервера, что позволяет пользователям реализовывать сложную логику обработки данных непосредственно в Redis. Кроме того, Redis поддерживает публикацию и подписку на каналы событий. Memcached имеет более ограниченный набор функций, сосредоточенных вокруг основной задачи кэширования, и не поддерживает скриптинг или публикацию/подписку. Ставь 👍 и забирай 📚 Базу знаний

🤔 Пример выполнения кода, когда возвращается объект интерфейса IQueryable? Особенности: - Метод возвращает IQueryable, что означает отложенное выполнение. - Запрос не выполняется сразу, пока не будет перечислен (ToList(), Count() и т.д.). - Это позволяет накапливать фильтры и выполнять один оптимизированный SQL-запрос. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Если в двух переменных хранится одинаковое значение, то будут ли они равны? Сравнение значений переменных может зависеть от типа данных, хранящихся в этих переменных, и от способа их сравнения. 🟠Примитивные типы (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
Ставь 👍 и забирай 📚 Базу знаний

🤔 Какие есть базовые сущности RabbitMQ? 1. Queue — очередь, куда отправляются сообщения. 2. Exchange — точка обмена, которая направляет сообщения в очереди на основе правил. 3. Binding — связь между Exchange и Queue, определяющая, какие сообщения попадут в очередь. 4. Message — само сообщение, отправляемое в RabbitMQ. 5. Connection — соединение клиента с сервером RabbitMQ. 6. Channel — виртуальный канал поверх соединения для работы с сообщениями. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое примитив синхронзиации 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");
Ставь 👍 и забирай 📚 Базу знаний

🤔 Как работает Entity Framework? Entity Framework — это ORM (Object-Relational Mapping) фреймворк для .NET, который позволяет разработчикам взаимодействовать с базой данных с помощью объектно-ориентированных моделей. Это упрощает работу с данными, автоматизируя задачи создания SQL-запросов и обработки данных. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Строки - значимый или ссылочный тип? В 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 (сравниваются значения, а не ссылки)
Ставь 👍 и забирай 📚 Базу знаний

🤔 Какие типы шаблонов проектирования есть? 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) Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Можно ли 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
    }
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Как происходит работа с Thread-ами и Task-ами, если из нескольких обращаться к общему state? При доступе к общему состоянию из нескольких Task или Thread могут возникнуть гонки данных (race conditions). Чтобы избежать ошибок: - Используют блокировки (lock, Monitor, Mutex). - Применяют конкурентные коллекции (ConcurrentDictionary, BlockingCollection). - Используют иммутабельность и локальные копии данных. - В случае async/await — состояние можно защищать SemaphoreSlim. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Теперь тебе не придется искать работу самому Совсем скоро я анонсирую первого в России AI-ассистента для поиска работы. И у т
Теперь тебе не придется искать работу самому Совсем скоро я анонсирую первого в России AI-ассистента для поиска работы. И у тебя будет шанс попробовать его бесплатно. Все, что нужно будет сделать - это пройти короткий опрос про твой опыт работы и подключить ее к аккаунту на хэдхантере. Дальше произойдет магия. 🔵Софи структурирует твой опыт в резюме и опишет его через результаты. А еще добавит ключевые слова и адаптирует резюме под вакансию. 🔵Она сама будет делать до 100 откликов в день, причем каждый отклик будет соответствовать твоему стеку, зарплатным ожиданиям и нужному формату работы. 🔵Софи будет писать сопроводительные письма для каждой компании, учитывая их ценности, боли и требования к сотрудникам. 🔵Ты больше не будешь узнавать про отказы от работодателей - Софи будет присылать только полезные апдейты по сделанным откликам. 🔵Как только ты получишь приглашение на собес, Софи найдет свободный слот в твоем календаре и запланирует встречу. А еще пришлет тебе описание компании, вакансии, вопросы которые могут задать и материалы по подготовке. 15 июля я проведу прямой эфир и открою бесплатный доступ к Софи для 350 человек. Сразу после мы закроем продажи на несколько недель. Первые пользователи также получат 2 бонуса: -3 месяца подписки за 14990 3500 рублей. -Бесплатный доступ к тренажеру собеседований на 1 месяц. 15 июля. 350 мест. Подпишись, чтобы не пропустить.

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

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

🤔 Если в двух переменных хранится одинаковое значение, то будут ли они равны? Сравнение значений переменных может зависеть от типа данных, хранящихся в этих переменных, и от способа их сравнения. 🟠Примитивные типы (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
Ставь 👍 и забирай 📚 Базу знаний

🤔 В чём разница в загрузке данных между жадной, ленивой и явной? - Жадная (Eager) загрузка — данные загружаются вместе с основным объектом сразу, обычно через Include. Это снижает количество запросов, но может привести к избытку данных. - Ленивая (Lazy) загрузка — связанные данные подгружаются только при первом доступе к ним. Это удобно, но требует осторожности (можно случайно вызвать лишние запросы). - Явная (Explicit) загрузка — данные подгружаются вручную при необходимости, через отдельный вызов. Такой подход даёт полный контроль, но требует больше кода. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Какой смысл жить в нулевом поколении и надолго ли продлится жизнь? Ты говоришь про объекты в нулевом поколении (Generation 0) в сборщике мусора (Garbage Collector, GC) в .NET? Если да, то это очень хорошая тема! 🚩Что значит "жить в нулевом поколении"? 🟠Gen 0 (нулевое поколение) самые молодые объекты. Это временные, краткоживущие данные, которые часто быстро удаляются. 🟠Gen 1 (первое поколение) промежуточное поколение. Объекты, пережившие хотя бы одну очистку Gen 0. 🟠Gen 2 (второе поколение) долгоживущие объекты. Обычно это крупные структуры данных, которые редко изменяются. 🚩Почему нулевое поколение важно? GC оптимизирован так, что маленькие и "короткоживущие" объекты (например, переменные внутри метода) создаются в Gen 0 и быстро удаляются. Это позволяет экономить память и ускорять работу приложения. Если объект долго живет, он "повышается" в следующее поколение (Gen 1, затем Gen 2). GC чаще очищает Gen 0, а Gen 2 – реже, так как там хранятся важные данные, которые не стоит часто перемещать. 🚩Надолго ли объект остается в Gen 0? Очень недолго! Вся идея Gen 0 в том, чтобы быстро выделять и быстро освобождать память. Если объект не используется после первой очистки GC, он удаляется. Если объект нужен дальше – он переходит в Gen 1.
class Program
{
    static void Main()
    {
        for (int i = 0; i < 1000; i++)
        {
            var obj = new object(); // Создаем объект в Gen 0
        } // obj выходит из области видимости и уничтожается GC
    }
}
Здесь объекты быстро уничтожаются в Gen 0, так как они больше не нужны. А если объект нужен долго:
class Program
{
    static object _longLivingObject = new object(); // Скорее всего, попадет в Gen 2

    static void Main()
    {
        Console.WriteLine("Объект долго живёт!");
    }
}
Ставь 👍 и забирай 📚 Базу знаний

Высшее образование дистанционно в Московском ВУЗе Вы мечтаете получить высшее образование, но не сдали ЕГЭ или получили низки
Высшее образование дистанционно в Московском ВУЗе Вы мечтаете получить высшее образование, но не сдали ЕГЭ или получили низкие баллы? У нас есть решение для вас! Институт Международных Экономических Связей предлагает дистанционное обучение , которое позволяет получать качественные знания из любой точки мира по 10+ направлениям обучения. ✅ Государственный диплом без отметки о дистантеУдобный личный кабинет студентаПоддержка кураторов на каждом этапе обученияМожно поступить без ЕГЭ Узнать больше #реклама 16+ imes.su О рекламодателе

🤔 Зачем нужны поколения для сборщика мусора? В .NET сборщик мусора использует поколения для оптимизации управления памятью. Объекты классифицируются по поколениям (0, 1 и 2), где молодые объекты в поколении 0 собираются чаще. Объекты, которые переживают сборку, перемещаются в старшее поколение, что уменьшает количество проверок этих объектов и улучшает производительность приложения. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

📺 Уникальная база IT собеседований 456+ реальных собеседований на программиста, тестировщика, аналитика и прочие IT профы. Е
📺 Уникальная база IT собеседований 456+ реальных собеседований на программиста, тестировщика, аналитика и прочие IT профы. Есть собесы от ведущих компаний: Сбер, Яндекс, ВТБ, Тинькофф, Озон, Wildberries и т.д. 🎯 Переходи по ссылке и присоединяйся к базе, чтобы прокачать свои шансы на успешное трудоустройство!