C# | Вопросы собесов
5.1K subscribers
36 photos
1 file
989 links
Download Telegram
Что такое IEnumerable ?
Спросят с вероятностью 22%

IEnumerable — это интерфейс в базовой библиотеке классов .NET Framework, который определяет один метод: GetEnumerator(). Этот метод возвращает объект IEnumerator, который позволяет перебирать элементы коллекции (например, массива или списка) один за другим.

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

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

Как он используется?

Когда вы реализуете интерфейс IEnumerable в своём классе, вы обязуете этот класс предоставлять метод GetEnumerator(), который возвращает IEnumerator. IEnumerator, в свою очередь, имеет методы для перехода к следующему элементу (MoveNext) и для получения текущего элемента (Current), а также метод Reset(), который возвращает перечислитель в начальное состояние.
using System;
using System.Collections;

public class DaysOfWeek : IEnumerable
{
private string[] days = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" };

public IEnumerator GetEnumerator()
{
for (int index = 0; index < days.Length; index++)
{
// Yield each day of the week.
yield return days[index];
}
}
}

public class Program
{
public static void Main()
{
DaysOfWeek daysOfWeek = new DaysOfWeek();
foreach (string day in daysOfWeek)
{
Console.WriteLine(day);
}
}
}


В этом примере класс DaysOfWeek реализует IEnumerable, что позволяет использовать его в цикле foreach для вывода всех дней недели. Использование yield return в методе GetEnumerator() упрощает создание итератора.

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

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

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

Поколения в сборке мусора (.NET Garbage Collector) играют важную роль в оптимизации процесса управления памятью. Использование поколений основывается на наблюдении, известном как "гипотеза о слабой генерализации", которая гласит, что большинство объектов умирает молодыми. Это означает, что объекты, которые были недавно созданы, с большей вероятностью будут недоступны или "умрут" быстро, в то время как объекты, которые уже существовали в течение более длительного времени, вероятнее всего, будут нужны программе еще дольше.

1️⃣Улучшение производительности

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

Частые сборы в младших поколениях: Поскольку большинство объектов умирает молодыми, частая сборка мусора в поколении 0 (где находятся новые объекты) быстро освобождает память, занимаемую недолговечными объектами, с минимальными затратами времени.
Реже сборы в старших поколениях: Объекты, которые выжили несколько сборок мусора и были продвинуты в поколение 1 и далее в поколение 2, проверяются на достижимость менее часто, что снижает нагрузку на систему.

2️⃣Минимизация фрагментации памяти

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

3️⃣Сокращение времени простоя

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

В приложении, где создаются множество временных объектов (например, в результате парсинга данных или обработки запросов пользователя), сборщик мусора быстро удаляет эти объекты в поколении 0, предотвращая накопление "мусора" и сохраняя высокую производительность приложения.

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

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

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍51
Forwarded from easyoffer
Канал приближается к 20к подписчиков, а здесь так и нет нормального контент плана 😒

Ищу талантливых журналистов, способных писать клевые и авторские посты на тему "Карьера в IT" и все что с этим связано: поиск работы, повышение з/п, разбор кейсов, переезд в другие страны по рабочим визам, аналитика, исследование рынка и т.д.

Важно глубокое понимание IT индустрии, вы должны иметь опыт работы в ней

Если интересно отправьте мне свое резюме @kivaiko
👍3🔥2
🤔 Какой модификатор доступа делает класс доступным только в текущей сборке?
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>