C# | Вопросы собесов
Kanalga Telegram’da o‘tish
Cайт easyoffer.ru Реклама @easyoffer_adv ВП @easyoffer_vp Тесты t.me/+nebTPWgpeGs1OWFi Задачи t.me/+Xy-0H7xKlgo0NDVi Вакансии t.me/+BQFHXZQ0zrViNGIy
Ko'proq ko'rsatish5 051
Obunachilar
-324 soatlar
-167 kunlar
-2830 kunlar
Postlar arxiv
5 050
📺 Уникальная база записей IT собеседований
300+ записей реальных собеседований на программиста, тестировщика, аналитика и прочие IT профы.
Записи собесов от ведущих компаний: Сбер, Яндекс, ВТБ, Тинькофф, Озон, Wildberries и т.д.
🎯 Переходи по ссылке и присоединяйся к базе, чтобы прокачать свои шансы на успешное трудоустройство!
У тебя есть запись собеседования? Мы готовы ее купить и заплатим до 3000 руб. за каждую
5 050
Дарим подписку на Яндекс Музыку
Ответьте на 1 вопрос и Яндекс Музыка для вас и 3-х ваших близких 60 дней бесплатно.
Кинопоиск и Яндекс Книги тоже в подписке.
Попробуйте сейчас❤️
Попробовать
#реклама 18+
music.yandex.ru
О рекламодателе
Реклама на Яндексе
5 050
🤔 Как понять, что в коде будет использоваться 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`, если
Вы выполняете запросы к базе данных или другому удаленному источнику данных. Требуется отложенное выполнение запросов для оптимизации выполнения. Нужно минимизировать объем данных, загружаемых в память, путем фильтрации на стороне сервера.
Ставь 👍 и забирай 📚 Базу знаний5 050
🤔 Что такое lock-еры?
Lock-еры — это объекты или механизмы, такие как lock в C#, которые предотвращают одновременный доступ к критическим участкам кода из нескольких потоков. Они обеспечивают безопасное выполнение кода в многопоточной среде, исключая гонки данных. Например, lock блокирует выполнение других потоков, пока текущий поток не завершит работу с ресурсом.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 050
Откройте подписку на Кинопоиск и Музыку за 1₽
Ответьте на 1 вопрос и получите в подарок доступ к Кинопоиску, Музыке и Книгам на 60 дней за 1 рубль.
✨ Сервисы будут доступны не только для Вас, но и для трёх ваших близких
Попробовать
#реклама 18+
kinopoisk.ru
О рекламодателе
Реклама на Яндексе
5 050
🤔 Что такое 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
}
}
🚩Плюсы
➕Контроль процесса создания
Позволяет контролировать процесс создания сложных объектов поэтапно.
➕Гибкость
Разделение конструирования и представления позволяет использовать один и тот же процесс для создания различных объектов.
➕Читаемость кода
Код становится более читаемым и поддерживаемым, так как процесс создания объекта инкапсулирован в отдельный класс.
➕Поддержка сложных объектов
Упрощает создание объектов с множеством параметров и сложной иерархией.
Ставь 👍 и забирай 📚 Базу знаний5 050
Российский сервис BI-аналитики – Modus BI
Платформа для бизнес-аналитики. Позволяет визуализировать показатели, определять тренды и находить зависимости, создавать прогнозы на основе ваших данных.
Включено в Единый реестр российского ПО.
Перейти на сайт
#реклама 16+
modusbi.ru
О рекламодателе
5 050
🤔 Что такое предикат?
Это делегат, представляющий метод, который принимает один или несколько аргументов и возвращает логическое значение (
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);
Ставь 👍 и забирай 📚 Базу знаний5 050
🤔 Для чего нужны нереляционные базы данных?
Нереляционные базы данных (NoSQL) используются для работы с большими объёмами данных, структурированных или неструктурированных, а также для обеспечения гибкости и масштабируемости. Они подходят для хранения документов, ключей-значений, графов или временных рядов. Такие базы, как MongoDB или Redis, идеальны для приложений с динамической структурой данных или высокой нагрузкой.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 050
Квартиры в Тюмени в семейную ипотеку от 13 233 ₽/мес
«Окинава» — современный ЖК в районе озера Алебашево. 10 минут до центра Тюмени.
Не упустите свою выгоду:
✅ Квартиры от 13 233 ₽/мес
✅ Платеж на весь срок
✅ Паркинг в подарок
Это не просто жилой комплекс, это остров 4 стихий. Каждая из стихий — отдельный дом и очередь строительства.
В «Окинаве» есть все для комфортной жизни:
— Видовые квартиры с террасой
— Закрытые дворы-стилобаты
— Функциональные планировки
— 2-уровневый пешеходный бульвар
Зафиксируйте условия покупки и получите подборку планировок! 🏠
Получить предложение
Финансовые услуги оказывает: ПАО "Сбербанк".
#реклама
mrqz.me
О рекламодателе
5 050
🤔 Чем от 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: Требует явного захвата и освобождения разрешений.
Ставь 👍 и забирай 📚 Базу знаний5 050
🤔 В чем разница между процессами и потоками?
Процессы — это независимые экземпляры программ, имеющие собственное адресное пространство. Потоки — это более лёгкие единицы выполнения, которые делят память и ресурсы внутри одного процесса. Потоки более экономичны в плане ресурсов, но сложнее в управлении из-за общих данных. Процессы изолированы друг от друга, что делает их более безопасными, но затратными.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 050
Миграция в облако? Это легко!
Собственная инфраструктура устарела или не справляется с нагрузками? Используйте облачные ресурсы! Эксперты Yandex Cloud помогут перейти в облако быстро, легко и безопасно.
✅ Мы полностью сопровождаем процесс.
✅ От вас — только инженер с доступом к инфраструктуре.
✅ Архитектура под ваши задачи, миграция и поддержка на каждом шагу — всё включено.
⚡Переходите в Yandex Cloud и забудьте о старом железе. А если успеете подать заявку до 31 декабря, мы покроем расходы на инженеров и тестовую инфраструктуру.
Подать заявку
#реклама 16+
yandex.cloud
О рекламодателе
Реклама на Яндексе
5 050
🤔 Для чего нужно разделение 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
}
}
Ставь 👍 и забирай 📚 Базу знаний5 050
А вы знали что?...
🕵️В Windows есть папка, которая собирает на вас компромат!
Посмотрите видео выше — насколько легко узнать всю информацию о вас
Простых способов узнать о вас практически всё — сотни, и если вы хотите соблюдать хотя бы минимум сетевой гигиены — подпишитесь на IT ВЕДОМСТВО
Они рассказывает о признаках майнеров, как удалить трояны и порно-баннеры за 5 минут
Помимо всего этого, сейчас владелец канала проводит розыгрыш умной колонки, для всех новоприбывших подписчиков
💻 Подписываемся на IT ВЕДОМСТВО — выигрываем призы и соблюдаем цифровую гигиену
5 050
🤔 В чем разница между процессами и потоками?
Процессы — это независимые экземпляры программ, имеющие собственное адресное пространство. Потоки — это более лёгкие единицы выполнения, которые делят память и ресурсы внутри одного процесса. Потоки более экономичны в плане ресурсов, но сложнее в управлении из-за общих данных. Процессы изолированы друг от друга, что делает их более безопасными, но затратными.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 050
Концептуальные офисы в БЦ RUNOVSKY 14
Концептуальное офисное пространство для работы, расположенное в историческом центре Москвы в районе Замоскворечье. Проект имеет свой неповторимый характер. Переосмысление стиля ар-деко нашло свое отражение в черных фасадах с арочным остеклением.
БЦ находится в 2 минутах ходьбы от метро "Новокузнецкая", через которую проходят основные пешие маршруты до Третьяковской галереи, парка Зарядья и Московкского Кремля.
Проектом предусмотрено большое количество планировочных решений офисов площадью от 27 м2 с возможностью объединения смежных помещений.
Тех, кто решит купить лот в "RUNOVSKY 14", ждет премиальный сервис, безопасность и комфортная атмосфера.
Перейти на сайт
#реклама
зиккурат.рф
О рекламодателе
5 050
🤔 Какие кучи существуют?
В .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 и используется для оптимизации управления краткоживущими объектами. Этот термин чаще встречается в контексте описания поведения сборщика мусора.
Ставь 👍 и забирай 📚 Базу знаний5 050
🤔 В чем разница между асинхронностью и многопоточностью?
Асинхронность и многопоточность — это два подхода к параллельной обработке задач. Асинхронность позволяет программе продолжать выполнение работы, в то время как она ждет завершения другой задачи (например, ввода/вывода), не блокируя основной поток. Многопоточность включает использование нескольких потоков для выполнения различных задач одновременно, что может ускорить выполнение программы за счет одновременной обработки данных.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 050
🤔 Как в кучах разделяются объекты?
В .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
}
}
Ставь 👍 и забирай 📚 Базу знаний
Endi mavjud! Telegram Tadqiqoti 2025 — yilning asosiy insaytlari 
