C# | Вопросы собесов
5.1K subscribers
36 photos
1 file
988 links
Download Telegram
🤔 Как в кучах разделяются объекты?

В .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
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21
🤔 В чем разница между Postgres и MySQL?

1. Postgres: поддерживает расширенные функции, такие как JSONB, сложные индексы, транзакции с ACID и CTE.
2. MySQL: быстрее на простых запросах, но ограничен в функциях для сложных операций.
3. Postgres больше подходит для аналитики, а MySQL — для высокопроизводительных веб-приложений.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10😁2
🤔 Как по ключу получить значение?

Для получения значения по ключу в словаре (Dictionary<TKey, TValue>) используются методы и свойства, такие как индексатор [], метод TryGetValue, и метод ContainsKey.

🟠Индексатор `[]`
Индексатор позволяет получить значение по ключу напрямую. Если ключ отсутствует в словаре, будет выброшено исключение KeyNotFoundException.
var dictionary = new Dictionary<int, string>
{
{ 1, "One" },
{ 2, "Two" },
{ 3, "Three" }
};

try
{
string value = dictionary[2]; // Получение значения по ключу 2
Console.WriteLine(value); // Выведет "Two"
}
catch (KeyNotFoundException)
{
Console.WriteLine("Key not found");
}


🟠Метод `TryGetValue`
Метод TryGetValue позволяет безопасно получить значение по ключу. Он возвращает true, если ключ найден, и false, если ключ отсутствует. При этом значение записывается в выходной параметр.
var dictionary = new Dictionary<int, string>
{
{ 1, "One" },
{ 2, "Two" },
{ 3, "Three" }
};

if (dictionary.TryGetValue(2, out string value))
{
Console.WriteLine(value); // Выведет "Two"
}
else
{
Console.WriteLine("Key not found");
}


🟠Метод `ContainsKey`
Метод ContainsKey проверяет наличие ключа в словаре. Его можно использовать в сочетании с индексатором для получения значения.
var dictionary = new Dictionary<int, string>
{
{ 1, "One" },
{ 2, "Two" },
{ 3, "Three" }
};

if (dictionary.ContainsKey(2))
{
string value = dictionary[2];
Console.WriteLine(value); // Выведет "Two"
}
else
{
Console.WriteLine("Key not found");
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
🤔 Что известно про нормализацию?

Это процесс организации данных в БД для уменьшения избыточности и улучшения целостности.
1. Делится на формы: 1NF, 2NF, 3NF и др., каждая из которых убирает определённые типы дублирования данных.
2. Помогает уменьшить объём хранимой информации и улучшить производительность запросов.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4
🤔 Что такое куки и где оно хранится в запросе?

Это небольшие фрагменты данных, которые веб-сайты сохраняют на устройствах пользователей для хранения информации о сессии и отслеживания состояния. Куки используются для различных целей, таких как аутентификация пользователей, хранение настроек и предпочтений, а также отслеживание активности пользователей на сайте.

🚩Основные свойства

🟠Имя (Name)
Уникальный идентификатор для каждого куки.
🟠Значение (Value)
Данные, которые хранит куки.
🟠Домен (Domain)
Домен, для которого куки действителен.
🟠Путь (Path)
Путь на сервере, для которого куки действителен.
🟠Время истечения (Expiration/Max-Age)
Дата или время, когда куки должен быть удален.
🟠Безопасность (Secure)
Указывает, что куки должны передаваться только через HTTPS.
🟠HTTPOnly
Указывает, что куки недоступен через JavaScript, только через HTTP(S) запросы.

🚩Где хранятся

🟠Установка куки с сервера (Set-Cookie)
Сервер отправляет куки в ответе на запрос клиента с использованием заголовка Set-Cookie.
   HTTP/1.1 200 OK
Set-Cookie: sessionId=abc123; Path=/; Expires=Wed, 09 Jun 2023 10:18:14 GMT
Content-Type: text/html


🟠Отправка куки клиентом (Cookie)
Браузер автоматически добавляет соответствующие куки в заголовок Cookie при каждом последующем запросе к серверу, для которого эти куки действительны.
   GET /dashboard HTTP/1.1
Host: example.com
Cookie: sessionId=abc123


🚩Пример использования

Установка куки на сервере (пример на Node.js с использованием Express)
const express = require('express');
const app = express();

app.get('/', (req, res) => {
// Устанавливаем куки
res.cookie('sessionId', 'abc123', {
maxAge: 900000,
httpOnly: true
});
res.send('Куки установлены');
});

app.listen(3000, () => {
console.log('Server is running on port 3000');
});


Доступ к куки на клиенте (пример на JavaScript)
// Установка куки
document.cookie = "username=JohnDoe; expires=Thu, 18 Dec 2023 12:00:00 UTC; path=/";

// Получение всех куки
let cookies = document.cookie;
console.log(cookies);


🚩Важные моменты

🟠Безопасность
Куки с флагом Secure передаются только по HTTPS-соединениям. Куки с флагом HttpOnly недоступны через JavaScript, что помогает защитить их от XSS-атак.

🟠Размер и количество
Обычно один куки не должен превышать 4KB, и на одном домене может быть установлено не более 20-30 куки.

🟠Конфиденциальность
Куки могут содержать чувствительные данные, поэтому важно защищать их и использовать шифрование, если необходимо.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Что такое Docker Compose?

Это инструмент для управления многоконтейнерными приложениями.
1. Использует файл docker-compose.yml для описания конфигурации сервисов, сетей и томов.
2. Упрощает запуск и координацию нескольких контейнеров в одной системе.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥1
🤔 Что такое В3 индекс?

Это структура данных, используемая в системах управления базами данных (СУБД) для организации и ускорения доступа к данным. B-tree индекс является сбалансированным деревом, обеспечивающим эффективное выполнение операций поиска, вставки, удаления и диапазонного поиска. B-tree индекс используется большинством реляционных СУБД, таких как SQL Server, MySQL, PostgreSQL и Oracle.

🚩Основные характеристики B-tree индекса

🟠Сбалансированное дерево
B-tree индекс является сбалансированным деревом, где все листья находятся на одном уровне. Это обеспечивает равномерное время доступа к данным.

🟠Ключи и значения
В узлах B-tree хранятся ключи, которые могут ссылаться на строки в таблице или на другие узлы дерева.

🟠Упорядоченность
Ключи в каждом узле упорядочены, что позволяет эффективно выполнять бинарный поиск внутри узла.

🟠Диапазонные запросы
B-tree индекс эффективно поддерживает диапазонные запросы (например, поиск всех записей с ключами между заданными значениями).

🟠Динамическое поддержание
B-tree автоматически сбалансирован, что позволяет эффективно выполнять операции вставки, удаления и обновления.

🚩Пример использования

CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
FirstName VARCHAR(50),
LastName VARCHAR(50),
DepartmentID INT,
Salary DECIMAL(10, 2)
);

CREATE INDEX idx_lastname ON Employees(LastName);


🚩Операции

🟠Поиск
Операция поиска в B-tree выполняется за логарифмическое время O(log n), где n — количество узлов.
SELECT * FROM Employees WHERE LastName = 'Smith';   


🟠Диапазонный поиск
Диапазонные запросы, такие как поиск всех сотрудников с фамилией от 'A' до 'M', выполняются эффективно.
SELECT * FROM Employees WHERE LastName BETWEEN 'A' AND 'M';   


🟠Вставка
При вставке новой записи в таблицу с индексом B-tree, запись добавляется в соответствующее место, поддерживая балансировку дерева.
INSERT INTO Employees (EmployeeID, FirstName, LastName, DepartmentID, Salary)
VALUES (1, 'John', 'Doe', 10, 60000.00);


🟠Удаление
При удалении записи соответствующий ключ удаляется из B-tree, и дерево автоматически перестраивается, чтобы сохранить балансировку.
DELETE FROM Employees WHERE EmployeeID = 1;   


🚩Плюсы

Быстрый доступ
Обеспечивает быстрый доступ к данным благодаря сбалансированной структуре дерева.
Эффективная работа с большими объемами данных
Поддерживает операции вставки, удаления и поиска с логарифмической сложностью.
Поддержка диапазонных запросов
Эффективно обрабатывает диапазонные запросы благодаря упорядоченной структуре.
Автоматическая балансировка
Динамическая балансировка дерева обеспечивает равномерное время доступа и вставки/удаления.

🚩Минусы

Использование ресурсов
Требует дополнительного пространства для хранения структуры дерева и ключей.
Затраты на поддержание
Вставка и удаление могут требовать перестроения узлов, что влечет за собой дополнительные вычислительные затраты.
Фрагментация
При частых операциях вставки и удаления может возникнуть фрагментация, что может потребовать периодического обслуживания (например, реорганизации индекса).

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
🤔 Что такое виртуальное окружение?

Виртуальное окружение изолирует зависимости проекта, чтобы избежать конфликтов между библиотеками разных приложений.
1. В Python это достигается через venv или virtualenv.
2. Обеспечивает независимость пакетов и версий, необходимых для конкретного проекта.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Как работает хеш таблица?

Хеш-таблица использует хеш-функцию для преобразования ключей в индексы массива.
1. В случае коллизий применяется метод цепочек или открытая адресация.
2. Это обеспечивает быстрый доступ к данным со сложностью в среднем O(1).


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥4
🤔 В чем разница между асинхронностью и многопоточностью?

Это два различных, но часто связанных понятия, которые используются для управления выполнением задач таким образом, чтобы повысить эффективность и отзывчивость приложений. Хотя они оба направлены на оптимизацию выполнения программ, между ними есть ключевые различия в подходах и использовании.

🟠Асинхронность
Это подход, при котором задача может выполняться независимо от основного потока программы, и не блокирует его выполнение в ожидании завершения. Это позволяет программе продолжать работу, пока выполняется асинхронная операция, например, доступ к файлу или сетевой запрос. Ключевая особенность асинхронности заключается в том, что она позволяет обрабатывать задачи без блокировки, улучшая отзывчивость и производительность приложения, особенно в средах с графическим интерфейсом пользователя или в серверных приложениях.

🟠Многопоточность
Это подход, при котором несколько потоков исполнения работают параллельно, что позволяет выполнять несколько операций одновременно. Это может быть реализовано как на одном процессоре с использованием временной мультиплексированной многозадачности, так и на многоядерных процессорах, где каждый поток может выполняться фактически одновременно на своем ядре. Многопоточность идеально подходит для задач, требующих тяжелых вычислений, и может значительно ускорить выполнение программы за счет распараллеливания работы.

🚩Ключевые различия

🟠Цели использования
Асинхронность обычно используется для улучшения отзывчивости приложений и эффективного использования ожидания (например, I/O операции), тогда как многопоточность применяется для ускорения выполнения вычислительно сложных задач за счет параллелизма.

🟠Управление ресурсами
Асинхронные операции часто управляются операционной системой и могут использовать меньше ресурсов, поскольку не требуют постоянного выделения отдельного потока. Многопоточность требует более активного управления потоками, что может привести к большему потреблению памяти и процессорного времени.

🟠Сложность разработки
Работа с многопоточностью часто более сложна из-за необходимости синхронизации доступа к общим ресурсам и управления состоянием, что может привести к ошибкам, таким как взаимные блокировки и состояния гонки. Асинхронное программирование также требует понимания, но оно более структурировано и часто управляется с помощью высокоуровневых паттернов и библиотек.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
🤔 Что известно о хеш функции?

Хеш-функция преобразует входные данные произвольного размера в фиксированный размер.
1. Используется для создания ключей в хеш-таблицах, шифрования данных и проверки целостности.
2. Хорошая хеш-функция минимизирует коллизии и распределяет ключи равномерно.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥2
🤔 Что такое метод set?

Метод set в контексте чаще всего используется в свойствах (properties) класса и служит для установки значения свойства. Он работает как часть автоматического или пользовательского свойства, позволяя контролировать, что происходит, когда свойству присваивается значение.

🚩Что такое свойство?

Свойство (property) в C# – это синтаксический сахар, который позволяет обращаться к полям класса как к переменным, но при этом добавляет возможность добавлять логику для получения (get) и установки (set) значений.
public class Person
{
private string name; // Закрытое поле

public string Name // Свойство
{
get { return name; } // Получить значение
set { name = value; } // Установить значение
}
}


🚩Зачем нужен метод `set`?

🟠Контролировать логику установки значений
Например, вы можете ограничить, какие значения можно присваивать.

🟠Выполнять дополнительные действия при присваивании
Например, логирование или обновление других полей.

🟠Защищать данные
Вы можете использовать метод set для проверки значений на валидность или ограничения доступа (например, сделать его приватным).

🚩Пример использования `set`

Проверка входных данных:
public class Person
{
private int age;

public int Age
{
get { return age; }
set
{
if (value < 0)
{
throw new ArgumentException("Возраст не может быть отрицательным.");
}
age = value;
}
}
}


Только для чтения
Вы можете сделать set приватным, чтобы свойство можно было только читать извне:
public class Person
{
public string Name { get; private set; }

public Person(string name)
{
Name = name;
}
}


Автоматические свойства
Если вам не нужна дополнительная логика, можно использовать автоматические свойства
public class Person
{
public string Name { get; set; } // Автоматически создаются get и set
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
🤔 Что такое HTTP и HTTPS?

1. HTTP (HyperText Transfer Protocol): протокол передачи данных между клиентом и сервером без шифрования.
2. HTTPS: защищённая версия HTTP, использующая SSL/TLS для шифрования данных.
3. HTTPS обеспечивает безопасность, конфиденциальность и подлинность.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
🤔 Возможно ли как-нибудь ограничить типы, которые пользователь будет передавать через шаблон?

Можно ограничить типы, которые передаются в шаблоны (generics), с помощью ключевого слова where. Это позволяет указать, какие типы подходят для использования, обеспечивая безопасность и предсказуемость кода. Вот основные виды ограничений:

🟠Класс или структура
where T : class — только классы.
where T : struct — только структуры.

🟠Интерфейс
Указание интерфейса, который должен реализовать тип:
   public class MyClass<T> where T : IDisposable { }


🟠Базовый класс
Указание, что тип должен быть наследником определённого класса:
   public class MyClass<T> where T : Exception { }


🟠Конструктор
Ограничение на наличие конструктора без параметров:
   public class MyClass<T> where T : new() { }


🟠Комбинированные ограничения
Можно объединять несколько условий:
   public class MyClass<T> where T : class, IDisposable, new() { }


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
🤔 Для чего можно использовать Celery?

Это фреймворк для выполнения асинхронных задач и управления очередями.
1. Используется для выполнения фоновых задач, таких как отправка писем или обработка данных.
2. Поддерживает распределённую архитектуру, масштабируемость и повторное выполнение задач.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 В чем отличие 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;
}
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Что делает паттерн проектирования Factory?

Паттерн Factory предоставляет интерфейс для создания объектов, позволяя подклассам определять, какой объект создавать. Это изолирует логику создания объектов от их использования, упрощая управление зависимостями.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍1
🤔 В чем разница между FirstOfDefault и SingleOfDefault?

Методы FirstOrDefault и SingleOrDefault в LINQ используются для извлечения элементов из коллекции, но их логика работы отличается. Давайте разберем их подробно, с примерами.

🚩FirstOrDefault

FirstOrDefault возвращает первый элемент коллекции, который удовлетворяет условию (если условие указано), или первый элемент вообще, если условие отсутствует. Если в коллекции нет элементов, метод возвращает значение по умолчанию для типа (например, null для ссылочных типов или 0 для чисел).
Когда вас интересует первый элемент коллекции, но коллекция может быть пустой.
Когда вам неважно, есть ли другие элементы, соответствующие условию.
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };

// Возьмем первый элемент, который больше 3
int result = numbers.FirstOrDefault(n => n > 3); // result = 4

// Если условие не выполняется
int result2 = numbers.FirstOrDefault(n => n > 10); // result2 = 0 (default для int)

// Если коллекция пустая
List<int> emptyList = new List<int>();
int result3 = emptyList.FirstOrDefault(); // result3 = 0


🚩SingleOrDefault
SingleOrDefault возвращает единственный элемент из коллекции, который удовлетворяет условию. Если такого элемента нет, метод возвращает значение по умолчанию. Однако если в коллекции есть более одного элемента, удовлетворяющего условию, будет выброшено исключение (InvalidOperationException).
Когда вы ожидаете, что в коллекции будет ровно один элемент, соответствующий условию.
Когда наличие нескольких подходящих элементов является ошибкой и вы хотите это обработать.
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };

// Возьмем единственный элемент, равный 3
int result = numbers.SingleOrDefault(n => n == 3); // result = 3

// Если элемента, соответствующего условию, нет
int result2 = numbers.SingleOrDefault(n => n > 10); // result2 = 0

// Если элементов больше одного, возникает исключение
List<int> duplicateNumbers = new List<int> { 1, 2, 3, 3, 4 };
try
{
int result3 = duplicateNumbers.SingleOrDefault(n => n > 2);
}
catch (InvalidOperationException ex)
{
Console.WriteLine(ex.Message); // Ошибка: последовательность содержит несколько элементов
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍82
🤔 Как сейчас делается Singleton?

Singleton реализуется через статический экземпляр класса, который создаётся при первом доступе. Используется конструкция с lazy initialization и thread safety, например, через Lazy<T>.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍4
🤔 Какова концепция сборки мусора в С#?

Это автоматический процесс управления памятью, который освобождает память, занятую объектами, которые больше не используются приложением. Этот механизм помогает разработчикам избежать ошибок, связанных с управлением памятью вручную, таких как утечки памяти и неправильное использование освобожденных ресурсов.

🚩Основные концепции сборки мусора

🟠Управляемая куча (Managed Heap)
Управляемая куча — это область памяти, в которой размещаются объекты, созданные в управляемой среде .NET. Когда создается новый объект, память для него выделяется в управляемой куче.

🟠Корни (Roots)
Корни — это переменные и ссылки, которые являются начальными точками для сборки мусора. Они включают глобальные и статические переменные, локальные переменные в стеке, а также ссылки из регистров процессора.

🟠Алгоритм маркировки и сжатия (Mark-and-Compact)
GC использует алгоритм маркировки и сжатия для определения объектов, которые больше не используются. Сначала он помечает все доступные объекты (те, до которых можно добраться из корней), а затем удаляет все непомеченные объекты, освобождая их память.

🟠Поколения (Generations)
Память управляемой кучи разделена на три поколения: поколение 0, поколение 1 и поколение 2. Это позволяет оптимизировать процесс сборки мусора:
Поколение 0: Содержит новые объекты. Сборка мусора здесь происходит чаще всего, так как большинство объектов живут недолго.
Поколение 1: Содержит объекты, которые пережили одну сборку мусора.
Поколение 2: Содержит объекты, которые пережили несколько сборок мусора. Сборка мусора здесь происходит реже всего, так как такие объекты считаются долгоживущими.

🚩Этапы сборки мусора

🟠Инициализация сборки мусора
Когда выделяется новая память и управляемая куча достигает определенного порога, запускается процесс сборки мусора.

🟠Маркировка (Mark)
GC проходит по всем корням и помечает все объекты, которые могут быть достигнуты.

🟠Удаление (Sweep)
После маркировки все непомеченные объекты считаются недоступными и могут быть удалены.

🟠Сжатие (Compact)
Для улучшения производительности и уменьшения фрагментации памяти, сборщик мусора может переместить оставшиеся объекты, чтобы освободить блоки памяти.

class Program
{
static void Main()
{
for (int i = 0; i < 1000; i++)
{
CreateObject();
}

// Явный вызов сборщика мусора (не рекомендуется для обычного использования)
GC.Collect();
}

static void CreateObject()
{
MyClass obj = new MyClass();
// Объект obj будет собран сборщиком мусора, когда он больше не будет использоваться
}
}

class MyClass
{
// Поля и методы класса
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍3