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

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

@easy_c_sharp

Сайт: https://easyoffer.ru/
Все каналы: t.me/+xGeAw6ckJ4liYzQy

Контакт для рекламы: @sendme_ads
Subscribers
5.01K
Photos
40
Videos
0
Links
1.5K

Showing posts older than #2105 · Back to latest

Older Posts 20 shown
Post #2104 728
🤔 Зачем используется библиотека Moq?

Это библиотека для создания имитаций (mock) объектов в тестах.
1. Она позволяет подменять зависимости тестируемого кода фейковыми реализациями.
2. Используется для тестирования изолированных частей приложения без вызова реальных ресурсов.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
  • 👍 2
Post #2103 912
🤔 Расскажи про конкурентные коллекции?

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

🟠ConcurrentDictionary<TKey, TValue>
Это словарь, который позволяет безопасно добавлять, удалять и изменять элементы из нескольких потоков одновременно. Он реализует интерфейс IDictionary<TKey, TValue>.
var concurrentDictionary = new ConcurrentDictionary<int, string>();
concurrentDictionary.TryAdd(1, "value1");
concurrentDictionary.TryAdd(2, "value2");

string value;
if (concurrentDictionary.TryGetValue(1, out value))
{
Console.WriteLine(value); // Output: value1
}


🟠ConcurrentQueue<T>
Это очередь, которая обеспечивает безопасное добавление элементов в конец и извлечение из начала в многопоточной среде. Она реализует интерфейс IProducerConsumerCollection<T>.
var concurrentQueue = new ConcurrentQueue<int>();
concurrentQueue.Enqueue(1);
concurrentQueue.Enqueue(2);

int result;
if (concurrentQueue.TryDequeue(out result))
{
Console.WriteLine(result); // Output: 1
}


🟠ConcurrentStack<T>
Это стек, который обеспечивает безопасное добавление и извлечение элементов в многопоточной среде. Он также реализует интерфейс IProducerConsumerCollection<T>.
var concurrentStack = new ConcurrentStack<int>();
concurrentStack.Push(1);
concurrentStack.Push(2);

int result;
if (concurrentStack.TryPop(out result))
{
Console.WriteLine(result); // Output: 2
}


🟠ConcurrentBag<T>
Это коллекция, которая позволяет безопасно добавлять и извлекать элементы в многопоточной среде. Она не гарантирует порядок элементов, поэтому используется в случаях, когда порядок не имеет значения.
var concurrentBag = new ConcurrentBag<int>();
concurrentBag.Add(1);
concurrentBag.Add(2);

int result;
if (concurrentBag.TryTake(out result))
{
Console.WriteLine(result); // Output: 1 или 2
}


🟠BlockingCollection<T>
Это коллекция, которая поддерживает ограниченную емкость и блокировку потоков при добавлении или извлечении элементов. Она особенно полезна для реализации паттернов продюсер-потребитель.
var blockingCollection = new BlockingCollection<int>(boundedCapacity: 5);
Task.Run(() =>
{
for (int i = 0; i < 10; i++)
{
blockingCollection.Add(i);
Console.WriteLine($"Added {i}");
}
blockingCollection.CompleteAdding();
});

foreach (var item in blockingCollection.GetConsumingEnumerable())
{
Console.WriteLine($"Consumed {item}");
}


Ставь 👍 и забирай 📚 Базу знаний
  • 👍 1
Post #2102 930
🤔 Какова цель ключевого слова lock?

lock используется для синхронизации доступа к разделяемым ресурсам в многопоточном коде. Он:
- Гарантирует, что только один поток войдёт в критическую секцию кода.
- Блокирует объект (монитор), пока другой поток не освободит его.
Это предотвращает состояние гонки и обеспечивает корректную работу с общей памятью.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Post #2101 1.06K
🤔 Абстракция более высокого уровня — это Task или Thread?

Task — это более высокоуровневая абстракция над Thread или ThreadPool.
- Thread — примитив, напрямую управляет потоком ОС.
- Task — обёртка над ThreadPool-ом, планирует выполнение, поддерживает отмену (CancellationToken), продолжения (ContinueWith) и await.
Использовать Task предпочтительно в большинстве случаев.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
  • 🔥 2
  • 👍 1
Post #2100 1.09K
🤔 Что такое value-type?

Это значимый тип. Хранится в стеке или встроен в объект. Содержит само значение, а не ссылку. Примеры:
- int, float, bool, struct.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
  • 👍 2
Post #2099 1.25K
🤔 Что такое зацепление в коде?

Зацепление (coupling) — это мера зависимости одного модуля от другого.
- Сильное зацепление (tight coupling) — классы жёстко связаны, изменение одного требует изменения другого.
- Слабое зацепление (loose coupling) — классы слабо связаны через абстракции (например, интерфейсы), что повышает гибкость, масштабируемость и тестируемость.
Цель хорошего дизайна — добиться слабого зацепления и высокой связности внутри модуля.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
  • 💊 4
  • 👍 1
Post #2098 1.15K
🤔 В чём суть extension-методов?

Extension-методы позволяют добавлять методы к существующим типам, не изменяя их исходный код. Это:
- Делается с помощью static-класса и ключевого слова this перед параметром.
- Вызывается как обычный метод у объекта.
Это делает код более читаемым и расширяемым. Особенно полезны в LINQ и утилитарных сценариях.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
  • 🔥 1
Post #2097 1.22K
🤔 Какие основные паттерны используются в back-end?

На back-end чаще всего используются:
- Repository — для доступа к данным.
- Unit of Work — управление транзакциями.
- Dependency Injection — разделение зависимостей и реализаций.
- CQRS — разделение команд и запросов.
- Mediator — упрощает взаимодействие между компонентами.
- Factory / Abstract Factory — динамическое создание объектов.
- Builder — создание сложных объектов шаг за шагом.
- Strategy — переключение алгоритмов без изменения клиентского кода.
- Adapter — интеграция сторонних библиотек и API.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
  • 🔥 3
  • 🤔 2
Post #2096 1.08K
🤔 Для чего используется Dependency Injection?

Dependency Injection используется для:
1. Уменьшения связности между компонентами.
2. Повышения тестируемости за счет легкой замены зависимостей.
3. Управления жизненным циклом объектов через внешние механизмы, такие как контейнеры DI.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
  • 🔥 2
Post #2095 1.13K
🤔 Когда сравниваются String, мы сравниваем ссылки?

В .NET:
- При использовании оператора == или метода Equals() для строк — сравниваются значения, а не ссылки.
- Однако сравнение через ReferenceEquals() — это сравнение ссылок. Важно: строки в .NET иммутабельны и могут быть интернированы, то есть одинаковые строковые литералы могут указывать на одну и ту же область памяти.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
  • 👍 1
Post #2094 1.08K
🤔 В чем отличие 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;
}
}
}


Ставь 👍 и забирай 📚 Базу знаний
  • 👍 1
Post #2093 940
🤔 Какие есть уровни изоляции транзакций?

SQL поддерживает несколько уровней изоляции транзакций, которые определяют, какие изменения видны между конкурентными транзакциями:
- Read Uncommitted – транзакции могут читать "грязные" (неподтвержденные) данные из других транзакций. Возможны аномалии.
- Read Committed – транзакция видит только подтвержденные изменения других транзакций. Исключает "грязные" чтения.
- Repeatable Read – гарантирует, что данные, прочитанные в одной транзакции, не изменятся до ее завершения. Возможны фантомные чтения.
- Serializable – самый строгий уровень, полностью исключает аномалии за счет блокировки записей или использования версионности.
- Snapshot (в SQL Server) – каждая транзакция работает со "снимком" данных, исключая конфликты без блокировок.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Post #2092 905
🤔 Что такое Action Executor и Action Executing?

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

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Post #2091 970
🤔 Что такое .NET стандарт?

.NET Standard — это спецификация API, которая определяет набор базовых библиотек, доступных во всех реализациях .NET (например, .NET Framework, .NET Core, Xamarin, Unity и других). Она была создана для обеспечения совместимости между разными платформами .NET.

🚩Зачем нужен .NET Standard?

До появления .NET Standard существовало несколько отдельных реализаций .NET:
.NET Framework (для Windows-приложений)
.NET Core (кроссплатформенная версия .NET)
Mono/Xamarin (для мобильных и игровых приложений)
Каждая из них имела свои особенности и набор доступных API. Из-за этого разработчики, создавая библиотеку, сталкивались с проблемой совместимости: приходилось писать несколько версий кода под разные платформы или использовать Portable Class Library (PCL), которая имела ограниченный функционал.
.NET Standard решил эту проблему, введя единый набор API, который обязаны поддерживать все реализации .NET.

🚩Как это работает?

.NET Standard представляет собой абстрактную спецификацию API, которая реализуется разными версиями .NET. Например, .NET Standard 2.0 поддерживается в .NET Framework 4.6.1, .NET Core 2.0 и выше. Если библиотека написана под .NET Standard 2.0, её можно использовать во всех этих средах.

🚩Версии .NET Standard

Существуют разные версии .NET Standard, каждая из которых включает больше API, чем предыдущая. Чем выше версия, тем больше возможностей, но и тем меньше совместимость с более старыми реализациями .NET.

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

Создаём Class Library с таргетом .NET Standard 2.0:
   namespace MyLibrary
{
public class MathHelper
{
public static int Add(int a, int b)
{
return a + b;
}
}
}


Ставь 👍 и забирай 📚 Базу знаний
Post #2090 894
🤔 Что такое DI (инъекция зависимости)?

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


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
  • 🔥 1
Post #2089 985
🤔 Что такое Generic-и?

Термин "Generic" (общий тип) относится к функциональности, позволяющей определять классы, интерфейсы или методы с использованием параметра типа, который определяется в момент создания экземпляра класса или вызова метода. Обобщённые типы широко используются для повышения повторного использования кода, типобезопасности и производительности. Как и во многих других языках программирования, generics представляют собой мощный инструмент, который устраняет необходимость в чрезмерном приведении типов и может уменьшить количество дублирующего кода.

🚩Основы

Пример использования Generic-ов в классе
public class GenericList<T>
{
private T[] elements;
private int size;

public GenericList(int size)
{
elements = new T[size];
this.size = size;
}

public void Add(T element)
{
// Логика добавления элемента
}

public T this[int i]
{
get { return elements[i]; }
set { elements[i] = value; }
}
}


Пример использования Generic-ов в методе
public T GenericMax<T>(T x, T y) where T : IComparable
{
return x.CompareTo(y) > 0 ? x : y;
}


🚩Плюсы

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

➕Типобезопасность
Generics обеспечивают проверку типов на этапе компиляции. Это улучшает безопасность и стабильность кода, уменьшая риск возникновения ошибок во время выполнения программы из-за некорректного приведения типов.

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

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

Ставь 👍 и забирай 📚 Базу знаний
Post #2088 895
🤔 Примеры паттерна абстрактной фабрики?

Абстрактная фабрика — это паттерн, который позволяет создавать семейства взаимосвязанных объектов, не привязываясь к конкретным классам.
Пример:
В графической системе можно иметь:
- Button и Checkbox для Windows,
- Button и Checkbox для macOS.
Абстрактная фабрика позволяет создавать соответствующие элементы без знания, для какой платформы они реализованы.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
  • 👍 2
Post #2087 1.04K
🤔 Если в двух переменных хранится одинаковое значение, то будут ли они равны?

Сравнение значений переменных может зависеть от типа данных, хранящихся в этих переменных, и от способа их сравнения.

🟠Примитивные типы (Value Types)
Для примитивных типов (например, int, float, char, bool) значение хранятся непосредственно в переменных, и их сравнение выполняется по значению.
int a = 5;
int b = 5;

bool areEqual = (a == b); // True


🟠Ссылочные типы (Reference Types)
Для ссылочных типов (например, классы, строки) переменные содержат ссылки на объекты в куче. Сравнение ссылочных типов по умолчанию выполняется по ссылке, а не по значению.
class Person
{
public string Name { get; set; }
}

Person person1 = new Person { Name = "Alice" };
Person person2 = new Person { Name = "Alice" };

bool areEqual = (person1 == person2); // False, потому что сравниваются ссылки


🟠Строки (Strings)
Строки являются ссылочными типами, но переопределяют операторы сравнения == и Equals для сравнения по значению.
string str1 = "Hello";
string str2 = "Hello";

bool areEqual = (str1 == str2); // True, строки сравниваются по значению


🟠Кастомные классы
Для кастомных классов можно переопределить методы Equals и GetHashCode, чтобы сравнивать объекты по значению.
class Person
{
public string Name { get; set; }

public override bool Equals(object obj)
{
if (obj == null || GetType() != obj.GetType())
return false;

Person other = (Person)obj;
return Name == other.Name;
}

public override int GetHashCode()
{
return Name.GetHashCode();
}
}

Person person1 = new Person { Name = "Alice" };
Person person2 = new Person { Name = "Alice" };

bool areEqual = person1.Equals(person2); // True


Ставь 👍 и забирай 📚 Базу знаний
  • 🔥 1
Post #2082 2.25K
🤔 Какой слой rest и swap с точки зрения трехслойной архитектуры?

В трехслойной архитектуре (трехуровневая архитектура), также известной как многоуровневая архитектура, приложения разделяются на три логических слоя:

🟠Презентационный слой (Presentation Layer)
Отвечает за взаимодействие с пользователем. Веб-интерфейсы, мобильные приложения, десктопные приложения. Примеры: HTML/CSS/JavaScript для веб-приложений, UI-компоненты в мобильных и десктопных приложениях.
🟠Логический слой (Business Logic Layer)
Содержит бизнес-логику и правила приложения. Обрабатывает данные, выполняет вычисления, применяет бизнес-правила. Примеры: классы и методы, реализующие бизнес-логику, сервисы, обработчики данных.
🟠Слой данных (Data Access Layer):
Отвечает за взаимодействие с источниками данных. Операции с базами данных, файловыми системами, внешними сервисами. Примеры: репозитории, Data Access Objects (DAO), API-клиенты для доступа к внешним системам.

🚩REST


REST — это архитектурный стиль для разработки веб-сервисов. RESTful сервисы используют стандартные HTTP методы (GET, POST, PUT, DELETE и т.д.) для работы с ресурсами.
С точки зрения трехслойной архитектуры:
Презентационный слой:
Вызовы REST API могут происходить с клиентской стороны (например, AJAX запросы из веб-интерфейса) или через клиентские приложения.
Пример: фронтенд веб-приложения, который взаимодействует с REST API.
Логический слой:
REST API реализует бизнес-логику и выступает посредником между презентационным слоем и слоем данных.
Пример: контроллеры и сервисы, обрабатывающие REST запросы и выполняющие соответствующую бизнес-логику.
Слой данных:
REST API может взаимодействовать с базой данных или другими источниками данных для получения и сохранения информации.
Пример: методы в API, которые выполняют запросы к базе данных через репозитории или DAO.

🚩SWAP

SWAP — это гипотетический или менее распространенный термин, часто интерпретируемый как упрощенный API для веб-приложений.
Презентационный слой
Клиентские приложения или пользовательские интерфейсы могут вызывать методы SWAP для получения или отправки данных.Пример: веб-страницы или мобильные приложения, обращающиеся к SWAP для выполнения операций.
Логический слой:
SWAP обрабатывает бизнес-логику аналогично REST API, предоставляя упрощенные конечные точки для взаимодействия с данными.
Пример: сервисы, которые реализуют простые операции (CRUD) без сложной бизнес-логики.
Слой данных:
SWAP взаимодействует с базой данных или другими источниками данных для выполнения операций чтения/записи.
Пример: методы SWAP, которые обращаются к базе данных через абстрактные уровни доступа к данным.

Ставь 👍 и забирай 📚 Базу знаний
Post #2081 1.34K
🤔 Что такое делегат?

Делегат в C# — это тип, который представляет ссылки на методы с определённой сигнатурой. Делегаты используются для передачи методов в качестве параметров и для обратных вызовов (callbacks). Они являются основой для событий и лямбда-выражений в C#. Делегаты позволяют вызывать методы динамически, что делает код более гибким.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Older posts →
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →