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

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

Открыть в Telegram
5 051
Подписчики
-324 часа
-167 дней
-2830 день
Архив постов
📺 Уникальная база записей IT собеседований 300+ записей реальных собеседований на программиста, тестировщика, аналитика и прочие IT профы. Записи собесов от ведущих компаний: Сбер, Яндекс, ВТБ, Тинькофф, Озон, Wildberries и т.д. 🎯 Переходи по ссылке и присоединяйся к базе, чтобы прокачать свои шансы на успешное трудоустройство! У тебя есть запись собеседования? Мы готовы ее купить и заплатим до 3000 руб. за каждую

Дарим подписку на Яндекс Музыку Ответьте на 1 вопрос и Яндекс Музыка для вас и 3-х ваших близких 60 дней бесплатно. Кинопоиск
Дарим подписку на Яндекс Музыку Ответьте на 1 вопрос и Яндекс Музыка для вас и 3-х ваших близких 60 дней бесплатно. Кинопоиск и Яндекс Книги тоже в подписке. Попробуйте сейчас❤️ Попробовать #реклама 18+ music.yandex.ru О рекламодателе Реклама на Яндексе

🤔 Как понять, что в коде будет использоваться Iquerable, а не IEnumerable? Это интерфейсы, которые используются для работы с коллекциями данных, но они имеют разные цели и применяются в разных сценариях. Разница между ними лежит в подходе к выполнению запросов и обработке данных. Вот ключевые отличия и рекомендации по выбору между IEnumerable и IQueryable. 🚩IEnumerable 🟠Выполнение на стороне клиента Все операции выполняются на стороне клиента, то есть данные уже загружены в память. Подходит для работы с коллекциями, которые уже загружены в память (например, массивы, списки). 🟠Методы расширения LINQ Методы LINQ, такие как Where, Select и другие, применяются к объекту IEnumerable и выполняются на стороне клиента. Каждый метод LINQ создает новую коллекцию, что может привести к повышенным затратам памяти и времени выполнения. 🟠Ленивая загрузка (Lazy Loading) Операции с IEnumerable выполняются лениво, т.е. элементы коллекции обрабатываются по мере их запроса.
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };

// Пример запроса LINQ с использованием IEnumerable
IEnumerable<int> evenNumbers = numbers.Where(n => n % 2 == 0);

foreach (int number in evenNumbers)
{
    Console.WriteLine(number); // Выведет 2 и 4
}
🚩IQueryable 🟠Выполнение на стороне сервера Запросы IQueryable передаются внешнему источнику данных (например, базе данных) для выполнения. Запросы преобразуются в выражения, которые могут быть выполнены на стороне сервера, что минимизирует объем данных, передаваемых в память. 🟠Построение выражений IQueryable поддерживает построение и выполнение выражений LINQ, которые могут быть оптимизированы источником данных перед выполнением. 🟠Отложенное выполнение (Deferred Execution) Запросы IQueryable не выполняются сразу при их определении. Они выполняются только при итерации или вызове метода, который требует выполнения запроса (например, ToList, FirstOrDefault).
using System.Linq;
using System.Data.Entity; // Пример для Entity Framework

public class MyDbContext : DbContext
{
    public DbSet<Product> Products { get; set; }
}

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
}

public class Program
{
    public static void Main()
    {
        using (var context = new MyDbContext())
        {
            // Пример запроса LINQ с использованием IQueryable
            IQueryable<Product> expensiveProducts = context.Products.Where(p => p.Price > 100);

            foreach (Product product in expensiveProducts)
            {
                Console.WriteLine(product.Name);
            }
        }
    }
}
🚩Как понять, что использовать 🟠Используйте `IEnumerable`, если Коллекция уже загружена в память. Вы работаете с небольшими наборами данных. Не требуется выполнение запросов на стороне сервера. 🟠Используйте `IQueryable`, если Вы выполняете запросы к базе данных или другому удаленному источнику данных. Требуется отложенное выполнение запросов для оптимизации выполнения. Нужно минимизировать объем данных, загружаемых в память, путем фильтрации на стороне сервера. Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое lock-еры? Lock-еры — это объекты или механизмы, такие как lock в C#, которые предотвращают одновременный доступ к критическим участкам кода из нескольких потоков. Они обеспечивают безопасное выполнение кода в многопоточной среде, исключая гонки данных. Например, lock блокирует выполнение других потоков, пока текущий поток не завершит работу с ресурсом. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Откройте подписку на Кинопоиск и Музыку за 1₽ Ответьте на 1 вопрос и получите в подарок доступ к Кинопоиску, Музыке и Книгам
Откройте подписку на Кинопоиск и Музыку за 1₽ Ответьте на 1 вопрос и получите в подарок доступ к Кинопоиску, Музыке и Книгам на 60 дней за 1 рубль. ✨ Сервисы будут доступны не только для Вас, но и для трёх ваших близких Попробовать #реклама 18+ kinopoisk.ru О рекламодателе Реклама на Яндексе

🤔 Что такое builder паттерн? Это порождающий паттерн проектирования, который используется для пошагового создания сложных объектов. Он разделяет процесс конструирования объекта от его представления, позволяя создавать различные представления объекта, следуя одному и тому же процессу конструирования. 🚩Основные цели и задачи паттерна 🟠Разделение создания и представления Отделяет процесс конструирования объекта от его представления, чтобы один и тот же процесс мог использоваться для создания различных представлений объекта. 🟠Пошаговое создание объектов Позволяет создавать объекты поэтапно, контролируя процесс конструирования и предотвращая создание объекта в неконсистентном состоянии. 🟠Поддержка неизменяемых объектов Может использоваться для создания неизменяемых объектов с большим количеством опций и параметров. 🚩Структура паттерна 🟠Builder Определяет интерфейс для пошагового конструирования объекта. 🟠ConcreteBuilder Реализует интерфейс Builder и создает конкретный продукт. 🟠Director Управляет объектом Builder и задает алгоритм создания объекта. 🟠Product Класс, представляющий создаваемый сложный объект. 🚩Пример использования паттерна Строитель 1⃣Определение продукта
public class House
{
    public string Walls { get; set; }
    public string Roof { get; set; }
    public string Foundation { get; set; }

    public override string ToString()
    {
        return $"House with {Walls}, {Roof} and {Foundation}";
    }
}
2⃣Определение интерфейса Builder
public interface IHouseBuilder
{
    void BuildFoundation();
    void BuildWalls();
    void BuildRoof();
    House GetHouse();
}
3⃣Реализация конкретного Builder
public class ConcreteHouseBuilder : IHouseBuilder
{
    private House _house = new House();

    public void BuildFoundation()
    {
        _house.Foundation = "Concrete Foundation";
    }

    public void BuildWalls()
    {
        _house.Walls = "Concrete Walls";
    }

    public void BuildRoof()
    {
        _house.Roof = "Concrete Roof";
    }

    public House GetHouse()
    {
        return _house;
    }
}
4⃣Определение Director
public class ConstructionDirector
{
    private readonly IHouseBuilder _builder;

    public ConstructionDirector(IHouseBuilder builder)
    {
        _builder = builder;
    }

    public void ConstructHouse()
    {
        _builder.BuildFoundation();
        _builder.BuildWalls();
        _builder.BuildRoof();
    }
}
5⃣Использование паттерна Строитель
public class Program
{
    public static void Main()
    {
        IHouseBuilder builder = new ConcreteHouseBuilder();
        ConstructionDirector director = new ConstructionDirector(builder);

        director.ConstructHouse();
        House house = builder.GetHouse();

        Console.WriteLine(house); // Output: House with Concrete Walls, Concrete Roof and Concrete Foundation
    }
}
🚩ПлюсыКонтроль процесса создания Позволяет контролировать процесс создания сложных объектов поэтапно. ➕Гибкость Разделение конструирования и представления позволяет использовать один и тот же процесс для создания различных объектов. ➕Читаемость кода Код становится более читаемым и поддерживаемым, так как процесс создания объекта инкапсулирован в отдельный класс. ➕Поддержка сложных объектов Упрощает создание объектов с множеством параметров и сложной иерархией. Ставь 👍 и забирай 📚 Базу знаний

Российский сервис BI-аналитики – Modus BI Платформа для бизнес-аналитики. Позволяет визуализировать показатели, определять тр
Российский сервис BI-аналитики – Modus BI Платформа для бизнес-аналитики. Позволяет визуализировать показатели, определять тренды и находить зависимости, создавать прогнозы на основе ваших данных. Включено в Единый реестр российского ПО. Перейти на сайт #реклама 16+ modusbi.ru О рекламодателе

🤔 Что такое предикат? Это делегат, представляющий метод, который принимает один или несколько аргументов и возвращает логическое значение (true или false). Предикаты часто используются для фильтрации коллекций, поиска элементов и других операций, связанных с условными проверками. 🚩Особенности 🟠Тип делегата В C# предикат представлен делегатом Predicate<T>, который принимает один аргумент типа T и возвращает bool. 🟠Использование Предикаты обычно используются в методах стандартных коллекций, таких как List<T>, для поиска, удаления и фильтрации элементов. 🚩Пример использования предиката Определение предиката
public static bool IsEven(int number)
{
    return number % 2 == 0;
}
Использование предиката с методом коллекции
using System;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6 };

        // Использование предиката для поиска первого четного числа
        int firstEven = numbers.Find(IsEven);
        Console.WriteLine("First even number: " + firstEven);

        // Использование предиката для удаления всех четных чисел
        numbers.RemoveAll(IsEven);
        Console.WriteLine("Numbers after removing evens: " + string.Join(", ", numbers));
    }

    public static bool IsEven(int number)
    {
        return number % 2 == 0;
    }
}
🚩Лямбда-выражения как предикаты Лямбда-выражения часто используются для определения предикатов непосредственно в месте вызова метода. Это делает код более компактным и удобочитаемым. Пример использования лямбда-выражений
using System;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6 };

        // Использование лямбда-выражения для поиска первого четного числа
        int firstEven = numbers.Find(n => n % 2 == 0);
        Console.WriteLine("First even number: " + firstEven);

        // Использование лямбда-выражения для удаления всех четных чисел
        numbers.RemoveAll(n => n % 2 == 0);
        Console.WriteLine("Numbers after removing evens: " + string.Join(", ", numbers));
    }
}
🚩Сценарии использования предикатов 🟠Фильтрация коллекций Предикаты используются для определения условий фильтрации элементов в коллекциях.
List<int> evenNumbers = numbers.FindAll(IsEven);   
🟠Поиск элементов Предикаты помогают находить элементы, соответствующие определенному условию.
int firstEven = numbers.Find(IsEven);   
🟠Удаление элементов Предикаты используются для удаления элементов, соответствующих определенному условию.
numbers.RemoveAll(IsEven);   
Ставь 👍 и забирай 📚 Базу знаний

🤔 Для чего нужны нереляционные базы данных? Нереляционные базы данных (NoSQL) используются для работы с большими объёмами данных, структурированных или неструктурированных, а также для обеспечения гибкости и масштабируемости. Они подходят для хранения документов, ключей-значений, графов или временных рядов. Такие базы, как MongoDB или Redis, идеальны для приложений с динамической структурой данных или высокой нагрузкой. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Квартиры в Тюмени в семейную ипотеку от 13 233 ₽/мес «Окинава» — современный ЖК в районе озера Алебашево. 10 минут до центра
Квартиры в Тюмени в семейную ипотеку от 13 233 ₽/мес «Окинава» — современный ЖК в районе озера Алебашево. 10 минут до центра Тюмени. Не упустите свою выгоду: ✅ Квартиры от 13 233 ₽/мес ✅ Платеж на весь срок ✅ Паркинг в подарок Это не просто жилой комплекс, это остров 4 стихий. Каждая из стихий — отдельный дом и очередь строительства. В «Окинаве» есть все для комфортной жизни: — Видовые квартиры с террасой — Закрытые дворы-стилобаты — Функциональные планировки — 2-уровневый пешеходный бульвар Зафиксируйте условия покупки и получите подборку планировок! 🏠 Получить предложение Финансовые услуги оказывает: ПАО "Сбербанк". #реклама mrqz.me О рекламодателе

🤔 Чем от Lock`а отличаются mutex и семафор? Lock (монитор), Mutex и Semaphore – это три механизма синхронизации, используемые для управления доступом к общим ресурсам в многопоточном программировании. Хотя все они служат для синхронизации потоков, их поведение и случаи использования различаются. 🟠`Lock` (Монитор) Lock (в C# используется ключевое слово lock) или Monitor – это механизм синхронизации, который позволяет одному потоку захватить блокировку для определенной области кода, чтобы другие потоки не могли войти в эту область кода до освобождения блокировки. Область действия: Только внутри одного процесса. Рекурсивность: Поддерживает рекурсивные блокировки (один и тот же поток может захватить блокировку несколько раз). Простота использования: Легко использовать с ключевым словом lock.
private readonly object _lockObject = new object();

public void CriticalSection()
{
    lock (_lockObject)
    {
        // Критическая секция
    }
}
🟠`Mutex` Mutex (Mutual Exclusion) – это более сложный механизм синхронизации, который может использоваться для синхронизации потоков как внутри одного процесса, так и между разными процессами. Область действия: Может использоваться как внутри одного процесса, так и между разными процессами. Рекурсивность: Не поддерживает рекурсивные блокировки по умолчанию. Использование: Требует явного захвата и освобождения блокировки.
private readonly Mutex _mutex = new Mutex();

public void CriticalSection()
{
    _mutex.WaitOne(); // Захват мьютекса
    try
    {
        // Критическая секция
    }
    finally
    {
        _mutex.ReleaseMutex(); // Освобождение мьютекса
    }
}
🟠`Semaphore` Semaphore – это механизм синхронизации, который ограничивает доступ к ресурсу заданным количеством потоков одновременно. Существует два типа семафоров: Semaphore и SemaphoreSlim. Область действия: Может использоваться для синхронизации потоков внутри одного процесса (SemaphoreSlim) и между разными процессами (Semaphore). Многократный доступ: Позволяет нескольким потокам одновременно получать доступ к ресурсу, если количество разрешений больше нуля. Использование: Требует явного захвата и освобождения разрешения.
private readonly Semaphore _semaphore = new Semaphore(3, 3); // Максимум 3 потока

public void CriticalSection()
{
    _semaphore.WaitOne(); // Захват семафора
    try
    {
        // Критическая секция
    }
    finally
    {
        _semaphore.Release(); // Освобождение семафора
    }
}
🚩Ключевые различия 🟠Область действия Lock: Только внутри одного процесса. Mutex: Может использоваться для синхронизации между процессами. Semaphore: Может использоваться для синхронизации между процессами (Semaphore) и внутри одного процесса (SemaphoreSlim). 🟠Рекурсивность Lock: Поддерживает рекурсивные блокировки. Mutex: Не поддерживает рекурсивные блокировки по умолчанию. Semaphore: Не поддерживает рекурсивные блокировки. 🟠Многократный доступ Lock: Только один поток может захватить блокировку. Mutex: Только один поток может захватить блокировку. Semaphore: Несколько потоков могут захватить блокировку одновременно, если разрешений больше нуля. 🟠Простота использования Lock: Легко использовать с ключевым словом lock. Mutex: Требует явного захвата и освобождения блокировки. Semaphore: Требует явного захвата и освобождения разрешений. Ставь 👍 и забирай 📚 Базу знаний

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

Миграция в облако? Это легко! Собственная инфраструктура устарела или не справляется с нагрузками? Используйте облачные ресур
Миграция в облако? Это легко! Собственная инфраструктура устарела или не справляется с нагрузками? Используйте облачные ресурсы! Эксперты Yandex Cloud помогут перейти в облако быстро, легко и безопасно. ✅ Мы полностью сопровождаем процесс. ✅ От вас — только инженер с доступом к инфраструктуре. ✅ Архитектура под ваши задачи, миграция и поддержка на каждом шагу — всё включено. ⚡Переходите в Yandex Cloud и забудьте о старом железе. А если успеете подать заявку до 31 декабря, мы покроем расходы на инженеров и тестовую инфраструктуру. Подать заявку #реклама 16+ yandex.cloud О рекламодателе Реклама на Яндексе

🤔 Для чего нужно разделение Large object heap и small object heap? Разделение предназначено для оптимизации управления памятью и производительности работы приложения. 🚩Основные причины 🟠Оптимизация производительности сборщика мусора (GC) Малые объекты (SOH): Малые объекты имеют более короткий жизненный цикл и размещаются в поколениях (Gen 0, Gen 1 и Gen 2). Сборка мусора для этих объектов происходит чаще и быстрее. Большие объекты (LOH): Большие объекты имеют тенденцию жить дольше, и сборка мусора для них происходит реже, вместе с Generation 2. LOH не перемещает объекты в памяти, что уменьшает фрагментацию. 🟠Уменьшение фрагментации памяти SOH: Частые сборки мусора и перемещение объектов в памяти могут вызвать фрагментацию. Однако малые объекты легче перемещать и собирать. LOH: Большие объекты не перемещаются сборщиком мусора, что уменьшает фрагментацию, но может привести к тому, что большие блоки памяти не будут эффективно использоваться. 🟠Различные стратегии аллокации SOH: Использует компактные аллокаторы, что обеспечивает эффективное использование памяти для малых объектов и минимизирует накладные расходы. LOH: Большие объекты требуют более значительных блоков памяти, и их аллокация и деаллокация управляются отдельно для оптимизации использования этих больших блоков. 🚩ПлюсыЭффективное управление памятью Разделение позволяет лучше управлять памятью для малых и больших объектов, минимизируя накладные расходы и улучшая производительность. ➕Уменьшение фрагментации Фрагментация памяти уменьшается, так как большие объекты не перемещаются в памяти, а малые объекты легче компактируются. ➕Повышение производительности GC Сборка мусора для малых объектов происходит быстро и часто, тогда как сборка для больших объектов — реже и более эффективно. 🚩Пример использования Размещение малых объектов (SOH)
public class Program
{
    public static void Main()
    {
        // Создание малых объектов в SOH
        for (int i = 0; i < 1000; i++)
        {
            var obj = new object();
        }

        // Принудительная сборка мусора для малых объектов
        GC.Collect(0); // Сборка мусора для Generation 0
    }
}
Размещение больших объектов (LOH)
public class Program
{
    public static void Main()
    {
        // Создание большого объекта в LOH
        byte[] largeArray = new byte[100000]; // Размер больше 85,000 байт

        // Принудительная сборка мусора
        GC.Collect(2); // Сборка мусора для Generation 2 и LOH
    }
}
Ставь 👍 и забирай 📚 Базу знаний

А вы знали что?... 🕵️В Windows есть папка, которая собирает на вас компромат! Посмотрите видео выше — насколько легко узнать всю информацию о вас Простых способов узнать о вас практически всё — сотни, и если вы хотите соблюдать хотя бы минимум сетевой гигиены — подпишитесь на IT ВЕДОМСТВО Они рассказывает о признаках майнеров, как удалить трояны и порно-баннеры за 5 минут Помимо всего этого, сейчас владелец канала проводит розыгрыш умной колонки, для всех новоприбывших подписчиков 💻 Подписываемся на IT ВЕДОМСТВО — выигрываем призы и соблюдаем цифровую гигиену

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

Концептуальные офисы в БЦ RUNOVSKY 14 Концептуальное офисное пространство для работы, расположенное в историческом центре Мос
Концептуальные офисы в БЦ RUNOVSKY 14 Концептуальное офисное пространство для работы, расположенное в историческом центре Москвы в районе Замоскворечье. Проект имеет свой неповторимый характер. Переосмысление стиля ар-деко нашло свое отражение в черных фасадах с арочным остеклением. БЦ находится в 2 минутах ходьбы от метро "Новокузнецкая", через которую проходят основные пешие маршруты до Третьяковской галереи, парка Зарядья и Московкского Кремля. Проектом предусмотрено большое количество планировочных решений офисов площадью от 27 м2 с возможностью объединения смежных помещений. Тех, кто решит купить лот в "RUNOVSKY 14", ждет премиальный сервис, безопасность и комфортная атмосфера. Перейти на сайт #реклама зиккурат.рф О рекламодателе

🤔 Какие кучи существуют? В .NET среде управления памятью существуют несколько типов куч, каждая из которых предназначена для различных типов объектов и оптимизации производительности управления памятью. 🚩Управляемая куча (Managed Heap) Это основная область памяти, используемая средой выполнения .NET для управления динамически выделенной памятью. Она разделена на поколения для оптимизации производительности сборки мусора. 🟠Generation 0 (Gen 0) Содержит новосозданные объекты. Сборка мусора в этом поколении происходит чаще всего. Маленький размер, рассчитанный на быстрое освобождение памяти от краткоживущих объектов. 🟠Generation 1 (Gen 1) Промежуточное поколение. Объекты, которые пережили сборку мусора в Generation 0, перемещаются в Generation 1. Средний размер, служит буфером между краткоживущими и долгоживущими объектами. 🟠Generation 2 (Gen 2) Содержит объекты с длительным временем жизни. Объекты, которые пережили сборку мусора в Generation 1, перемещаются в Generation 2. Сборка мусора в этом поколении происходит реже всего. Самый большой размер среди всех поколений.
public class Program
{
    public static void Main()
    {
        // Создание объектов в Generation 0
        for (int i = 0; i < 1000; i++)
        {
            var obj = new object();
        }

        // Принудительный вызов сборщика мусора
        GC.Collect();

        // Проверка поколения объекта
        var objGen2 = new object();
        GC.Collect();
        Console.WriteLine(GC.GetGeneration(objGen2)); // Скорее всего, 2
    }
}
🚩Куча больших объектов (Large Object Heap, LOH) Куча больших объектов используется для размещения крупных объектов (размером 85,000 байт и более). LOH имеет свои особенности: 🟠Отсутствие перемещения Объекты в LOH не перемещаются при сборке мусора, что уменьшает фрагментацию памяти. 🟠Сборка мусора Сборка мусора для LOH происходит вместе с Generation 2.
public class Program
{
    public static void Main()
    {
        // Создание большого объекта (размещается в LOH)
        byte[] largeArray = new byte[100000];
        
        // Принудительный вызов сборщика мусора
        GC.Collect();

        // Проверка поколения объекта
        Console.WriteLine(GC.GetGeneration(largeArray)); // Скорее всего, 2
    }
}
🚩Сегментированные кучи (Segmented Heaps) Сегментированные кучи используются в серверной сборке мусора (Server GC), где для каждой логической обработки (ядра процессора) создается отдельная куча: 🟠Многопоточность Позволяет более эффективно использовать многопроцессорные системы. 🟠Изоляция Каждое ядро работает со своим сегментом памяти, что уменьшает конкуренцию за доступ к памяти. 🚩Упрощенная куча (Ephemeral Heap) Упрощенная куча представляет собой комбинацию Generation 0 и Generation 1 и используется для оптимизации управления краткоживущими объектами. Этот термин чаще встречается в контексте описания поведения сборщика мусора. Ставь 👍 и забирай 📚 Базу знаний

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

🤔 Как в кучах разделяются объекты? В .NET среде управления памятью, объекты размещаются в куче (heap), и управление памятью осуществляется сборщиком мусора (Garbage Collector, GC). Куча разделена на несколько поколений для оптимизации производительности управления памятью. 🚩Поколения кучи Куча в .NET разделена на три поколения: Generation 0, Generation 1 и Generation 2. Это разделение позволяет эффективно управлять памятью, минимизируя частоту сборок мусора и оптимизируя их выполнение. 🟠Generation 0 Содержит новосозданные объекты. Сборка мусора для этого поколения происходит чаще, так как большинство объектов "умирает" быстро. Наименьший размер среди всех поколений. 🟠Generation 1 Промежуточное поколение, используемое для объектов, которые пережили хотя бы одну сборку мусора Generation 0. Содержит объекты с более длительным временем жизни, чем объекты в Generation 0. 🟠Generation 2 Содержит объекты с самым длительным временем жизни. Наибольший размер среди всех поколений. Сборка мусора для этого поколения происходит реже всего. 🚩Large Object Heap (LOH) LOH используется для размещения крупных объектов (размером 85,000 байт и более). Объекты в LOH не перемещаются при сборке мусора, что уменьшает фрагментацию памяти. Сборка мусора для LOH происходит одновременно со сборкой Generation 2. 🚩Как разделяются объекты 🟠Размещение объектов При создании объекта он сначала размещается в Generation 0. Если объект переживает сборку мусора в Generation 0, он перемещается в Generation 1. Если объект переживает сборку мусора в Generation 1, он перемещается в Generation 2. 🟠Сборка мусора Generation 0: Быстрая и частая сборка. Цель - освободить память от краткоживущих объектов. Generation 1: Реже, чем Generation 0. Служит промежуточной зоной. Generation 2: Самая редкая и длительная сборка. Обрабатывает долгоживущие объекты. Large Object Heap (LOH): Сборка мусора проводится вместе с Generation 2.
public class Program
{
    public static void Main()
    {
        // Создание объектов в Generation 0
        for (int i = 0; i < 1000; i++)
        {
            var obj = new object();
        }

        // Создание большого объекта (размещается в LOH)
        byte[] largeArray = new byte[100000];
        
        // Принудительный вызов сборщика мусора
        GC.Collect();

        // Проверка поколения объекта
        Console.WriteLine(GC.GetGeneration(largeArray)); // Скорее всего, 2
    }
}
Ставь 👍 и забирай 📚 Базу знаний

C# | Вопросы собесов - Статистика и аналитика Telegram-канала @easy_c_sharp