C# | Вопросы собесов
5.1K subscribers
34 photos
1 file
990 links
Download Telegram
🤔 Какой модификатор доступа делает класс доступным только в текущей сборке?
Anonymous Quiz
2%
public
8%
private
78%
internal
11%
protected
👍21
Какие проблемы могут быть при многопоточности и как их избежать ?
Спросят с вероятностью 22%

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

Основные проблемы:

1️⃣Гонки данных (Race Conditions)
Проблема: Два или более потоков пытаются одновременно изменить общие данные или один поток читает данные во время их изменения другим потоком, что приводит к непредсказуемым результатам.
Решение: Использование механизмов синхронизации, таких как блокировки (locks), мьютексы (mutexes) и семафоры (semaphores), для контроля доступа к общим ресурсам.

2️⃣Взаимная блокировка (Deadlock)
Проблема: Два или более потоков бесконечно ожидают ресурсы, заблокированные друг другом, в результате чего они не могут продолжить выполнение.
Решение: Разработка программы таким образом, чтобы потоки запрашивали ресурсы всегда в одном и том же порядке, использование таймаутов для блокировок, чтобы потоки могли выйти из состояния ожидания.

3️⃣Голодание (Starvation)
Проблема: Один или несколько потоков не могут получить доступ к необходимым ресурсам, потому что другие потоки постоянно занимают их.
Решение: Применение справедливых блокировок (fair locks) или алгоритмов планирования, которые обеспечивают всем потокам равный доступ к ресурсам.

4️⃣Переключение контекста (Context Switching)
Проблема: Частое переключение контекста между потоками может значительно снизить производительность системы, особенно если потоки часто блокируются и разблокируются.
Решение: Оптимизация количества потоков, уменьшение зависимостей между потоками и уменьшение использования блокировок.

5️⃣Проблемы с проектированием
Проблема: Неправильное проектирование многопоточной архитектуры может привести к сложностям в поддержке и расширении программного обеспечения.
Решение: Использование абстракций высокого уровня для работы с потоками, таких как пулы потоков, параллельные библиотеки (например, TPL в .NET) и модели акторов.

Использование блокировки:
private static readonly object _lock = new object();
private static int _sharedResource;

public static void UpdateResource()
{
lock (_lock)
{
_sharedResource++;
// Выполнение некоторой работы с общим ресурсом
}
}


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

Избегание взаимной блокировки:
private static readonly object _lock1

= new object();
private static readonly object _lock2 = new object();

public static void Method1()
{
lock (_lock1)
{
// Некоторые действия
lock (_lock2)
{
// Дополнительные действия
}
}
}

public static void Method2()
{
lock (_lock1)
{
// Аналогичные действия
lock (_lock2)
{
// Дополнительные действия
}
}
}


Запрашивая блокировки в одном и том же порядке, мы предотвращаем взаимную блокировку, которая могла бы возникнуть, если бы порядок блокировок был обратным в разных методах.

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

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥31
Какие API можно назвасть Restо-вым ?
Спросят с вероятностью 22%

RESTful API (Representational State Transfer) — это архитектурный стиль взаимодействия компонентов в сети. Создание его включает в себя следование ряду принципов, которые делают API легко использовать и интегрировать в различные приложения. Основные принципы REST включают использование стандартных методов HTTP, семантически ясных URL и передачу данных в форматах, таких как JSON или XML. Чтобы API можно было назвать RESTful, он должен следовать этим ключевым принципам:

1️⃣Использование стандартных методов HTTP:
GET: Получение данных.
POST: Создание новой записи.
PUT: Обновление существующей записи.
DELETE: Удаление записи.

2️⃣Без сохранения состояния (Stateless):
Каждый запрос от клиента к серверу должен содержать всю информацию, необходимую для выполнения запроса. Сервер не должен хранить контекст клиента между запросами.

3️⃣Кэширование:
Ответы должны быть явно маркированы как кэшируемые или некэшируемые, чтобы клиенты могли избежать повторной отправки запросов за неизменной информацией.

4️⃣Единообразие интерфейса:
Интерфейс должен быть единообразным, что облегчает взаимодействие с API. URL должны быть структурированы логически, а передача данных должна быть прозрачной и понятной.

5️⃣Слоистая система:
Клиент не должен обязательно знать, общается ли он напрямую с сервером или через промежуточные слои (прокси, балансировщики нагрузки).

Примеры популярных RESTful API:

GitHub API: Предоставляет доступ к функциям, таким как репозитории, коммиты, вопросы и т.д., используя стандартные методы HTTP для управления ресурсами.

Twitter API: Позволяет разработчикам взаимодействовать с основными аспектами Twitter, включая твиты, профили пользователей и т.д.

Google Maps API: Дает возможность добавлять карты Google и другие функции местоположения в веб-сайты и приложения.

Amazon S3 API: Обеспечивает программный доступ к функциям хранения файлов на Amazon S3.

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

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥2
В чем разница между процессами и потоками ?
Спросят с вероятностью 22%

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

Процесс

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

Изоляция: Процессы изолированы друг от друга, что обеспечивает безопасность и стабильность системы. Ошибка в одном процессе обычно не влияет на работу других процессов.
Переключение контекста: При переключении между процессами операционная система должна сохранять и восстанавливать контекст процесса, что может быть ресурсоёмкой операцией.
Взаимодействие: Процессы могут взаимодействовать друг с другом через механизмы межпроцессного взаимодействия (IPC), такие как сокеты, файлы, общая память и другие.

Поток (Thread)

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

Разделение ресурсов: Все потоки внутри одного процесса разделяют одно и то же адресное пространство и системные ресурсы, что позволяет им эффективно обмениваться данными без использования IPC.
Создание и управление: Создание потока быстрее и требует меньше ресурсов, чем создание процесса. Переключение контекста между потоками происходит быстрее, чем между процессами.
Риски и недостатки: Поскольку потоки разделяют память, ошибка в одном потоке, такая как неправильная работа с памятью, может повлиять на другие потоки и весь процесс.

Представьте себе браузер, который является одним процессом. Внутри этого процесса могут работать множество потоков: один поток может обрабатывать пользовательский интерфейс, другой — загрузку данных с интернета, а третий — выполнение JavaScript на веб-странице. Ошибки в потоке выполнения JavaScript не должны влиять на поток пользовательского интерфейса, позволяя пользователю закрыть вкладку, которая вызвала сбой.

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

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍82
Что такое ref & out ?
Спросят с вероятностью 22%

ref и out являются модификаторами параметров, которые позволяют методам изменять значения переменных, переданных в качестве аргументов. Оба модификатора используются для передачи аргументов по ссылке, но они работают немного по-разному и применяются в различных сценариях.

ref

Используется для передачи переменной по ссылке. Это означает, что любые изменения, сделанные с переменной внутри метода, отражаются на исходной переменной, переданной из вызывающего кода. Важно отметить, что переменная, передаваемая с модификатором ref, должна быть инициализирована перед передачей в метод.
void Increment(ref int number)
{
number += 1;
}

int value = 5;
Increment(ref value);
Console.WriteLine(value); // Выведет 6


В этом примере value передаётся по ссылке, так что изменения в методе Increment видны и снаружи метода.

out

Также используется для передачи аргументов по ссылке, но оно имеет одно ключевое отличие от ref: переменная, передаваемая с out, не обязательно должна быть инициализирована до её использования в методе. Однако метод, получающий параметр out, обязан присвоить этой переменной значение до выхода из метода.
void GetCoordinates(out int x, out int y)
{
x = 10;
y = 20;
}

int a, b;
GetCoordinates(out a, out b);
Console.WriteLine(a); // Выведет 10
Console.WriteLine(b); // Выведет 20


Здесь переменные a и b не были инициализированы перед передачей в метод GetCoordinates. Метод же устанавливает их значения, которые затем доступны после выполнения метода.

Сравнение ref и out

Инициализация: Переменные, передаваемые с ref, должны быть инициализированы перед вызовом метода. Переменные, передаваемые с out, инициализируются внутри метода.
Использование: ref используется, когда переменная уже содержит важное значение, которое может быть изменено, в то время как out используется, когда необходимо вернуть значение, которое устанавливается внутри метода.

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

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31
Как работает async/await ?
Спросят с вероятностью 22%

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

1️⃣Определение async

Используется для определения метода как асинхронного. Это не делает метод асинхронным само по себе, но указывает, что внутри метода возможно использование await. Асинхронные методы обычно возвращают Task или Task<T>, где T — тип возвращаемого значения. В случае, если метод не должен возвращать значение, он может возвращать Task. Если метод помечен как async void, это обычно используется для обработчиков событий, где возвращаемое значение не требуется.

2️⃣Использование await

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

3️⃣Пример использования
public async Task<string> FetchWebPageAsync(string url)
{
using (HttpClient client = new HttpClient())
{
string result = await client.GetStringAsync(url);
// Код после 'await' выполняется после завершения GetStringAsync
return result;
}
}


В этом примере метод FetchWebPageAsync асинхронно загружает содержимое веб-страницы. Вызов await client.GetStringAsync(url) приостанавливает выполнение метода FetchWebPageAsync до тех пор, пока не будет получен ответ от метода GetStringAsync. Важно отметить, что в это время поток не блокируется, что позволяет пользовательскому интерфейсу или другим операциям продолжать работать.

Преимущества:

Улучшение отзывчивости приложения: Главный поток (например, пользовательский интерфейс) не блокируется, что позволяет приложению оставаться отзывчивым на действия пользователя.
Упрощение кода: Код с использованием async и await проще для понимания и поддержки, по сравнению с традиционными подходами к асинхронному программированию, такими как использование обратных вызовов (callbacks) или цепочек продолжений (ContinueWith).

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

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍72👾2
Как работает Entity Framework ?
Спросят с вероятностью 22%

Entity Framework (EF) — это ORM (Object-Relational Mapping) фреймворк, который позволяет разработчикам взаимодействовать с базами данных, используя объектно-ориентированные модели. Это упрощает разработку приложений, автоматизируя большую часть кода, необходимого для доступа к данным. EF позволяет программистам работать с данными на более высоком уровне абстракции, с использованием объектов и классов, без необходимости писать SQL-запросы напрямую.

Как он работает

EF предоставляет два основных способа работы: Database-First и Code-First.

1️⃣Database-First

Подход начинается с существующей базы данных. С помощью инструментов, таких как Visual Studio, можно автоматически создать модель, которая отображает таблицы базы данных на классы в коде. Эти классы, которые являются частью .NET проекта, используются для взаимодействия с данными в базе данных.

2️⃣Code-First

Позволяет определять модели данных сначала в коде. Затем EF использует эти модели для генерации базы данных. Это удобно, когда разработка начинается с нуля, и нет начальной базы данных. Code-First также предоставляет возможности для миграций, позволяя разработчикам управлять изменениями в структуре базы данных через версии приложения.

Основные компоненты:

DbContext: Это класс, который управляет отношениями между объектами C# и базой данных. Он включает в себя функции для запросов, сохранения данных и конфигурации маппинга.
DbSet: Представляет коллекцию объектов, которая связана с определенной таблицей в базе данных. Разработчики могут использовать объекты DbSet для запросов и манипуляций с данными.
LINQ to Entities: Язык запросов, который позволяет писать запросы к данным, используя синтаксис LINQ C#. Эти запросы переводятся в SQL-запросы EF когда они исполняются.
public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=Blogging;Integrated Security=True");
}
}

public class Blog
{
public int BlogId { get; set; }
public string Name { get; set; }
public List<Post> Posts { get; set; }
}

public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public int BlogId { get; set; }
public Blog Blog { get; set; }
}

class Program
{
static void Main(string[] args)
{
using (var db = new BloggingContext())
{
var blog = new Blog { Name = "Первый блог" };
db.Blogs.Add(blog);
db.SaveChanges();

var post = new Post { Title = "Hello World", Content = "Это первый пост", BlogId = blog.BlogId };
db.Posts.Add(post);
db.SaveChanges();

var query = from b in db.Blogs
orderby b.Name
select b;

foreach (var b in query)
{
Console.WriteLine(b.Name);
}
}
}
}


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

Entity Framework значительно упрощает разработку приложений за счет предоставления мощного слоя абстракции для работы с базами данных. Он позволяет концентрироваться на бизнес-логике, минимизируя рутинную работу по написанию SQL-запросов и управлению схемой базы данных.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
🤔 Что возвращает метод GetHashCode()?
Anonymous Quiz
41%
Строку
46%
Число
7%
Массив
5%
Список
Что такое join ?
Спросят с вероятностью 22%

Термин "join" может относиться к нескольким различным концепциям в зависимости от контекста, в котором он используется. Рассмотрим два основных применения: операции соединения в базах данных и методы синхронизации потоков в программировании.

1️⃣Join в базах данных

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

Основные типы:

INNER JOIN: Возвращает строки, когда есть совпадение в обеих таблицах.
LEFT (OUTER) JOIN: Возвращает все строки из левой таблицы и совпавшие строки из правой таблицы. Если совпадения нет, результат будет содержать NULL на местах колонок правой таблицы.
RIGHT (OUTER) JOIN: Возвращает все строки из правой таблицы и совпавшие строки из левой таблицы. Если совпадения нет, результат будет содержать NULL на местах колонок левой таблицы.
FULL (OUTER) JOIN: Возвращает строки, когда есть совпадение в одной из таблиц. Если совпадения нет, в результате будет NULL на местах колонок другой таблицы.
SELECT Employees.Name, Departments.DepartmentName
FROM Employees
INNER JOIN Departments ON Employees.DepartmentId = Departments.Id;


Этот запрос возвращает имена сотрудников вместе с названиями их отделов, основываясь на связи через DepartmentId.

2️⃣Join в многопоточном программировании

Используется для ожидания завершения потока. Когда один поток вызывает join() на другом потоке, первый поток приостанавливает своё выполнение до тех пор, пока поток, на котором был вызван join(), не завершится.
Thread thread = new Thread(() -> {
System.out.println("Новый поток запущен");
try {
Thread.sleep(2000); // Имитация работы потока
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
System.out.println("Новый поток завершен");
});

thread.start();
thread.join(); // Ожидаем завершения потока
System.out.println("Основной поток завершен");


В этом примере основной поток будет ожидать завершения нового потока перед тем, как вывести сообщение о своем завершении.

Понятие "join" может быть применено в разных областях программирования, но в каждом случае оно связано с идеей объединения или ожидания. В базах данных это объединение таблиц для получения комплексных данных — синхронизация потоков для управления порядком выполнения операций.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31🔥1
Что такое инкапсуляция ?
Спросят с вероятностью 22%

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

Основные аспекты:

1️⃣Скрытие данных: Приватные поля класса скрыты от внешнего доступа, что предотвращает непреднамеренные изменения состояния объекта, которые могут привести к ошибкам или некорректному поведению программы.

2️⃣Контроль доступа: Использование модификаторов доступа, таких как private, protected, и public, позволяет точно настраивать уровень доступа к методам и полям класса.

3️⃣Объединение данных и методов: Инкапсуляция также включает в себя объединение данных (переменных) и методов, которые работают с этими данными, в единую структуру — класс.
public class BankAccount
{
private decimal balance; // Приватное поле, недоступное извне

public BankAccount(decimal initialBalance)
{
balance = initialBalance;
}

// Публичный метод для добавления средств
public void Deposit(decimal amount)
{
if (amount > 0)
{
balance += amount;
}
}

// Публичный метод для снятия средств
public void Withdraw(decimal amount)
{
if (amount > 0 && amount <= balance)
{
balance -= amount;
}
}

// Публичный метод для получения текущего баланса
public decimal GetBalance()
{
return balance;
}
}


В этом примере balance — это приватное поле, которое нельзя прочитать или изменить напрямую извне класса. Вместо этого предоставляются публичные методы Deposit, Withdraw и GetBalance для управления балансом, что обеспечивает контроль над тем, как внешние компоненты могут взаимодействовать с внутренним состоянием объекта.

Зачем она нужна

Инкапсуляция помогает в достижении следующих целей:

Повышение уровня безопасности: Защита внутреннего состояния объекта от непреднамеренных или вредоносных изменений.
Упрощение технического обслуживания и модификации: Изменения внутренней реализации класса могут быть выполнены с минимальным воздействием на код, который использует этот класс.
Разделение интерфейса и реализации: Пользователи класса могут взаимодействовать с ним через четко определенный интерфейс без необходимости понимания деталей его реализации.

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

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Что такое абстракция ?
Спросят с вероятностью 22%

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

Основные аспекты:

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

2️⃣Обобщение функционала: Позволяет создавать общие решения, которые можно легко адаптировать или расширить для решения специфических задач. Это достигается за счет определения общих интерфейсов или базовых классов, которые могут быть уточнены или расширены в производных классах.

3️⃣Уменьшение взаимозависимости компонентов: Поскольку она позволяет разделять интерфейс и реализацию, компоненты программы могут быть менее зависимы друг от друга. Это упрощает замену одних компонентов другими и делает код более модульным.
public abstract class Vehicle
{
public abstract void Move();

public void Start()
{
Console.WriteLine("Vehicle has started.");
}
}

public class Car : Vehicle
{
public override void Move()
{
Console.WriteLine("Car is moving.");
}
}

public class Airplane : Vehicle
{
public override void Move()
{
Console.WriteLine("Airplane is flying.");
}
}


В этом примере Vehicle является абстрактным классом, который определяет абстрактный метод Move() и конкретный метод Start(). Метод Move() абстрактен, потому что каждый вид транспорта перемещается по-своему: автомобиль едет, самолет летит. Класс Vehicle предоставляет абстракцию для всех видов транспортных средств, скрывая детали о том, как именно они перемещаются, и предоставляя общий интерфейс для их запуска.

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

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍41🤔1
🤔 Какая из следующих операций в C# не поддерживает перегрузку операторов?
Anonymous Quiz
32%
инкремент (++)
8%
деление (/)
56%
логическое И (&&)
4%
сложение (+)
Что такое сборщик мусора ?
Спросят с вероятностью 22%

Сборщик мусора (Garbage Collector, GC) — это форма автоматического управления памятью. Он отслеживает каждый объект, выделенный в куче, и определяет, какие объекты более не доступны для приложения, а затем освобождает память, занимаемую этими объектами. Это ключевой компонент во многих современных языках программирования и средах выполнения, облегчая задачу управления памятью.

Основные этапы работы:

1️⃣Маркировка (Marking): Сборщик мусора периодически проходит через все объекты в куче, начиная с "корней" (объектов, непосредственно доступных в программе, например, через переменные в стеке вызовов и глобальные переменные). Он отмечает все объекты, до которых можно добраться напрямую или косвенно.

2️⃣Очистка (Sweeping): После маркировки доступных объектов, сборщик мусора удаляет все непомеченные объекты, освобождая ресурсы, которые они занимали.

3️⃣Компактификация (Compacting): Некоторые сборщики мусора перемещают оставшиеся объекты, чтобы уменьшить фрагментацию памяти и улучшить производительность работы с памятью.

Почему он важен

Преимущества:

Предотвращение утечек памяти: Автоматически освобождает память, которая больше не используется, тем самым предотвращая утечки памяти, которые могут привести к исчерпанию доступных ресурсов.
Уменьшение ошибок программирования: Уменьшает количество ошибок, связанных с управлением памятью, таких как двойное освобождение памяти или ошибки доступа к "висячим" (уже освобожденным) указателям.
Упрощение разработки: Разработчикам не нужно явно освобождать память, что упрощает процесс написания и поддержки кода.

Ограничения:

Несмотря на многие преимущества, сборщик мусора также имеет недостатки:

Производительность: Процесс сборки мусора может быть ресурсоёмким и может привести к заметным паузам в выполнении программы, особенно если куча большая.
Непредсказуемость: Точное время сборки мусора может быть непредсказуемым, что может создавать проблемы в приложениях с реальным временем.

В среде .NET, например, сборщик мусора управляется CLR (Common Language Runtime) и работает автоматически, облегчая задачу управления памятью для разработчиков C# и других .NET-языков. Сборка мусора управляется JVM (Java Virtual Machine), которая предлагает разные типы сборщиков мусора, настраиваемых под различные типы приложений.

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

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое Action Executor и Action Executing ?
Спросят с вероятностью 22%

"Action Executor" и "Action Executing" относятся к компонентам и процессам, управляющим выполнением действий контроллера. Они являются частью жизненного цикла запроса в MVC и играют ключевую роль в обработке запросов и генерации ответов. Подробно рассмотрим каждый из этих терминов.

Action Executor

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

Обрабатывает логику выбора и вызова нужного метода действия, а также управляет привязкой данных запроса к параметрам метода. В случае ASP.NET Core, это может включать использование IActionInvoker или аналогичных интерфейсов, которые реализуют различные стратегии для вызова действий контроллера.

Action Executing

Относится к процессу, происходящему непосредственно перед выполнением метода действия в контроллере. В ASP.NET MVC это часто управляется с помощью фильтров действий, специально ActionExecutingContext.

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

Аутентификация и авторизация: Проверка того, имеет ли пользователь права на выполнение данного действия.
Валидация данных: Проверка входящих данных на корректность перед обработкой методом действия.
Кэширование: Определение, может ли ответ быть извлечён из кэша, чтобы избежать выполнения метода действия.
Логирование и аудит: Запись информации о запросе и его обработке.

Фильтры действий в ASP.NET MVC реализуются через реализацию интерфейсов IActionFilter или IAsyncActionFilter и могут быть применены глобально или на уровне отдельных контроллеров или действий.
public class LogActionFilter : IActionFilter
{
public void OnActionExecuting(ActionExecutingContext context)
{
// Логика перед выполнением действия
Log.Information("Action {ActionName} is executing.", context.ActionDescriptor.DisplayName);
}

public void OnActionExecuted(ActionExecutedContext context)
{
// Логика после выполнения действия
Log.Information("Action {ActionName} executed.", context.ActionDescriptor.DisplayName);
}
}


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

Action Executor и Action Executing являются важными аспектами в управлении жизненным циклом запроса, позволяя контролировать, как запросы обрабатываются и ответы генерируются в их веб-приложениях.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
🤔 Какой интерфейс используется для асинхронных потоков данных в C#?
Anonymous Quiz
46%
IAsyncEnumerable<T>
40%
IAsyncResult<T>
10%
IQueryable<T>
4%
IObservable<T>
Какие преимущества представляет C# 12 ?
Спросят с вероятностью 22%

Вот некоторые из функций и улучшений в C# 12:

1️⃣List Patterns
Списочные шаблоны позволяют упростить и сделать более интуитивно понятными проверки списков и массивов. Это расширение существующих возможностей сопоставления с образцом и позволяет разработчикам легко проверять содержимое коллекций.

2️⃣Required Properties
Обязательные свойства улучшат обработку данных, делая явным требование наличия значения для свойств во время создания объекта. Это облегчит создание более безопасных по типам и предсказуемых приложений, уменьшая вероятность ошибок, связанных с отсутствием данных.

3️⃣Improved Pattern Matching
Повышение возможностей сопоставления с образцом продолжает развиваться, обеспечивая более мощные и гибкие способы деконструкции и проверки данных без необходимости писать многословный и ошибочный код.

4️⃣Enhanced Lambdas
Улучшения в лямбда-выражениях, включая новые возможности типизации и возможно улучшения по производительности. Это делает лямбда-выражения еще более мощным инструментом для разработчиков.

5️⃣UTF-8 String Literals
Поддержка литералов строк в UTF-8 может быть добавлена для улучшения обработки текстовых данных, что особенно важно в приложениях, работающих с многими языками и большими объемами текстовых данных.

6️⃣Record Improvements
Записи (records) были введены в C# 9 и представляют собой неизменяемый тип данных, идеально подходящий для создания компактных объектов данных. Улучшения в записях могут включать новые способы работы с ними или расширение их функциональности.

7️⃣Static Virtual Members in Interfaces
Статические виртуальные члены в интерфейсах позволят создавать более гибкие и мощные абстракции, давая разработчикам больше контроля над реализацией и наследованием в их программных структурах.

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

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍81🔥1
👀8👍1
Какие механизмы позволяют не нарушать принцип dependency inversion ?
Спросят с вероятностью 22%

Принцип инверсии зависимостей (Dependency Inversion Principle, DIP) является одним из пяти принципов SOLID, который играет важную роль в проектировании гибкой и устойчивой к изменениям архитектуры программного обеспечения. Этот принцип утверждает, что:

1️⃣Модули высокого уровня не должны зависеть от модулей низкого уровня. Оба типа модулей должны зависеть от абстракций.
2️⃣Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.

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

Механизмы для реализации принципа:

1️⃣Использование интерфейсов и абстрактных классов
Позволяют определять контракты для функционала, которые должны реализовать конкретные классы, не указывая, каким образом эта функциональность будет выполнена. Такой подход позволяет компонентам общаться друг с другом через абстракции, а не конкретные реализации.

2️⃣Внедрение зависимостей (Dependency Injection, DI)
Это техника, при которой один объект предоставляет зависимости другому объекту. Это может быть реализовано через конструктор, методы установки или прямое внедрение через свойства. Frameworks like Spring for Java, .NET Core’s built-in DI container, or Google Guice help manage dependencies at runtime, allowing for more flexible and decoupled code architectures.

3️⃣Инверсия управления (Inversion of Control, IoC) контейнеры
IoC контейнеры управляют созданием объектов и их жизненным циклом, а также реализуют DI для передачи зависимостей. Примеры таких контейнеров включают Autofac, Unity в .NET, или Spring IoC в Java.

4️⃣Фабричные методы
Этот шаблон проектирования используется для создания объектов без спецификации конкретных классов объектов. Класс Фабрика обычно возвращает объект базового типа или интерфейса, позволяя программе быть гибкой в отношении создаваемых объектов.

5️⃣Сервис-локатор
Хотя это менее предпочтительный способ по сравнению с DI (так как вводит глобальную зависимость), сервис-локатор может использоваться для управления зависимостями в приложении. Он позволяет извлекать экземпляры компонентов по запросу, используя конфигурацию, определённую в одном центральном месте.
public interface IDataRepository
{
void Save(string data);
}

public class DataRepository : IDataRepository
{
public void Save(string data)
{
Console.WriteLine("Data saved: " + data);
}
}

public class BusinessLogic
{
private readonly

IDataRepository _dataRepository;

// Constructor injection
public BusinessLogic(IDataRepository dataRepository)
{
_dataRepository = dataRepository;
}

public void ProcessData(string data)
{
_dataRepository.Save(data);
}
}

class Program
{
static void Main(string[] args)
{
IDataRepository repo = new DataRepository();
BusinessLogic logic = new BusinessLogic(repo);
logic.ProcessData("Example data");
}
}


В этом примере зависимость IDataRepository внедряется в BusinessLogic через конструктор, что обеспечивает слабую связанность и упрощает тестирование компонентов.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21👀1