C# | Вопросы собесов
رفتن به کانال در Telegram
Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @sendme_ads
نمایش بیشتر5 013
مشترکین
+124 ساعت
+47 روز
+1930 روز
آرشیو پست ها
5 014
🤔 Можно ли передать значимый тип данных по ссылке?
Да, можно!
По умолчанию значимые типы (структуры,
int, double) передаются по значению.
Но их можно передать по ссылке с помощью ref или out.
🚩Передача по значению (обычное поведение)
Копия передаётся в метод, а оригинал не меняется.
void ChangeValue(int number)
{
number = 10; // Изменится только копия
}
int x = 5;
ChangeValue(x);
Console.WriteLine(x); // 5 (значение не изменилось)
🚩Передача значимого типа по ссылке (`ref`)
Позволяет менять оригинальную переменную.
void ChangeValue(ref int number)
{
number = 10; // Меняем оригинальное значение
}
int x = 5;
ChangeValue(ref x);
Console.WriteLine(x); // 10 (значение изменилось)
🚩Использование `out` (без начального значения)
out тоже передаёт по ссылке, но требует обязательного присвоения внутри метода.
void InitializeValue(out int number)
{
number = 100; // Обязательно присваиваем значение
}
int x;
InitializeValue(out x);
Console.WriteLine(x); // 100
Ставь 👍 и забирай 📚 Базу знаний5 014
🤔 Что из себя представляет DI в ASP.NET Core?
Dependency Injection (внедрение зависимостей) — это встроенный механизм, с помощью которого ASP.NET Core:
- Создаёт и управляет зависимостями (объектами).
- Позволяет вкладывать зависимости в конструкторы или методы.
- Использует контейнер служб, где регистрируются интерфейсы и реализации.
DI позволяет отделить создание объектов от их использования, улучшая тестируемость и масштабируемость.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 014
🤔 Если в двух переменных хранится одинаковое значение, то будут ли они равны?
Сравнение значений переменных может зависеть от типа данных, хранящихся в этих переменных, и от способа их сравнения.
🟠Примитивные типы (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
Ставь 👍 и забирай 📚 Базу знаний5 014
Хэтчбек SOLARIS KRX от производителя. Бронируйте!
Комфорт в каждой поездке. Ограниченная партия у оф. дилеров. Получите выгоду!
Узнать больше
#реклама
mrqz.me
О рекламодателе
5 014
🤔 Что такое interlocked?
Interlocked — это механизм для безопасного изменения чисел между потоками без использования блокировок. Он позволяет выполнять операции вроде прибавления или замены значений мгновенно и без конфликта, что важно для высокой производительности при простых действиях.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 014
🤔 Что такое сборщик мусора?
Сборщик мусора (Garbage Collector, GC) — это форма автоматического управления памятью. Он отслеживает каждый объект, выделенный в куче, и определяет, какие объекты более не доступны для приложения, а затем освобождает память, занимаемую этими объектами. Это ключевой компонент во многих современных языках программирования и средах выполнения, облегчая задачу управления памятью.
🚩Основные этапы работы
🟠Маркировка (Marking)
Сборщик мусора периодически проходит через все объекты в куче, начиная с "корней" (объектов, непосредственно доступных в программе, например, через переменные в стеке вызовов и глобальные переменные). Он отмечает все объекты, до которых можно добраться напрямую или косвенно.
🟠Очистка (Sweeping)
После маркировки доступных объектов, сборщик мусора удаляет все непомеченные объекты, освобождая ресурсы, которые они занимали.
🟠Компактификация (Compacting)
Некоторые сборщики мусора перемещают оставшиеся объекты, чтобы уменьшить фрагментацию памяти и улучшить производительность работы с памятью.
🚩Ограничения
🟠Производительность
Процесс сборки мусора может быть ресурсоёмким и может привести к заметным паузам в выполнении программы, особенно если куча большая.
🟠Непредсказуемость
Точное время сборки мусора может быть непредсказуемым, что может создавать проблемы в приложениях с реальным временем.
Ставь 👍 и забирай 📚 Базу знаний
5 014
🤔 Какая разница между методом clone и CopyTo массивов?
- clone() — создает новый массив с копиями элементов. Возвращает Object, требует приведения.
- CopyTo() — копирует элементы в существующий массив с заданного индекса.
Таким образом, clone возвращает новый объект, а CopyTo работает с уже существующим массивом.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 014
🤔 Какие тесты бывают?
🚩Виды
🟠Юнит-тесты
Предназначены для проверки отдельных компонентов или модулей приложения в изоляции. Они помогают убедиться, что отдельные функции или методы работают правильно.
Цель: Проверка логики отдельных методов или классов.
Инструменты: xUnit, NUnit, MSTest.
using Xunit;
public class CalculatorTests
{
[Fact]
public void Add_SimpleValues_ReturnsSum()
{
var calculator = new Calculator();
var result = calculator.Add(2, 3);
Assert.Equal(5, result);
}
}
public class Calculator
{
public int Add(int a, int b)
{
return a + b;
}
}
🟠Интеграционные тесты
Проверяют взаимодействие между различными компонентами системы, убеждаясь, что они корректно работают вместе.
Цель: Проверка взаимодействия между модулями.
Инструменты: xUnit, NUnit, MSTest, плюс дополнительные библиотеки для тестирования баз данных или HTTP-запросов.
using System.Net.Http;
using System.Threading.Tasks;
using Xunit;
public class IntegrationTests
{
private readonly HttpClient _client;
public IntegrationTests()
{
var appFactory = new CustomWebApplicationFactory<Startup>();
_client = appFactory.CreateClient();
}
[Fact]
public async Task Get_EndpointReturnsSuccessAndCorrectContentType()
{
var response = await _client.GetAsync("/api/values");
response.EnsureSuccessStatusCode();
Assert.Equal("application/json; charset=utf-8", response.Content.Headers.ContentType.ToString());
}
}
🟠Функциональные тесты
Проверяют, что приложение выполняет свои функции в соответствии с требованиями. Эти тесты проверяют конкретные сценарии использования.
Цель: Проверка функциональности приложения на уровне пользователя.
Инструменты: Selenium, Playwright, Cypress.
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using Xunit;
public class UiTests
{
[Fact]
public void LoadPage_CheckTitle()
{
using (IWebDriver driver = new ChromeDriver())
{
driver.Navigate().GoToUrl("https://example.com");
Assert.Equal("Example Domain", driver.Title);
}
}
}
🟠Системные тесты
Проверяют приложение в целом, включая взаимодействие с внешними системами и проверку всех требований.
Цель: Проверка всей системы в интегрированном виде.
Инструменты: JUnit, TestNG для Java, или те же инструменты, что и для функциональных тестов.
🟠Приемочные тесты
Проводятся для проверки, что приложение соответствует требованиям и готово к использованию клиентом или конечным пользователем.
Цель: Подтверждение соответствия приложения требованиям.
Инструменты: Cucumber, SpecFlow (для BDD).
🟠Регрессионные тесты
Проверяют, что недавние изменения в коде не нарушили существующую функциональность.
Цель: Убедиться, что новые изменения не привели к новым багам.
Инструменты: Все инструменты для юнит-тестирования и функционального тестирования.
🟠Нагрузочные тесты
Проверяют, как приложение ведет себя под нагрузкой, например, при большом количестве одновременных пользователей или операций.
Цель: Оценка производительности и устойчивости приложения под нагрузкой.
Инструменты: JMeter, Gatling, Apache Bench.
Ставь 👍 и забирай 📚 Базу знаний5 014
REKONFA: что интересного вас ждёт 15 октября
15 октября встречаемся на REKONFA — большой конференции Яндекс Рекламы.
На сцене:
— Глеб Доброрадных — о рекламном рынке и эффективности в сложных условиях
— Алексей Штоколов — о новых продуктах и технологиях
— Лиза Смирнова — о 360°-форматах и новых точках контакта
— Александр Пушной — о человеке и ИИ
— Александр Умаров — о персональном подходе, который помогает влюблять клиентов в бренд
— Яна Чурикова — об актуальных задачах предпринимателей
— Татьяна Мужицкая — о целях и энергии
— Антон Беляев — об индивидуальности и проектах, которые любят зрители
Вне сцены — зона продуктов Яндекс Рекламы, три игры, викторина, зоны Яндекс Ярда и eLama и нетворкинг.
15 октября, Москва, ВТБ Арена и онлайн. Участие бесплатное.
Зарегистрироваться
#реклама 18+
ya.rekonfa.ru
О рекламодателе
5 014
🤔 Можно ли в рамках lock использовать await?
Нет, нельзя. Ожидание с await может привести к тому, что поток выйдет из текущего блока и продолжит выполнение в другом — это нарушает правила lock, который должен оставаться в одном потоке. Для асинхронного кода используют другие механизмы синхронизации.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 014
🤔 Что такое делегаты и зачем они нужны?
Делегаты — это типы, которые безопасно инкапсулируют методы, подобно указателям на функции в других языках программирования, но с проверкой типов во время компиляции. Могут ссылаться на метод, который принимает параметры и возвращает значение. Они используются для реализации обратных вызовов и событий, а также для определения пользовательских операций, которые могут быть выполнены методом, принимаемым в качестве параметра.
🚩Зачем они нужны?
🟠Обратные вызовы (Callbacks)
Делегаты предоставляют механизм для передачи методов в качестве аргументов другим методам. Это полезно для реализации обратных вызовов, позволяя вызывать методы в ответ на определенные события или условия.
🟠События
Являются основой системы событий. Они позволяют определять события и подписываться на них. Когда событие происходит, вызываются делегаты, связанные с этим событием, что позволяет реагировать на изменения или действия пользователя.
🟠Параметризация методами
Позволяют создавать более гибкие и масштабируемые приложения, поскольку методы могут быть переданы и использованы динамически в различных контекстах.
🟠Асинхронное программирование
Используются для асинхронного программирования, позволяя выполнять задачи в фоновом режиме, не блокируя основной поток приложения.
public delegate int Operation(int x, int y);
public class Calculator
{
public int PerformOperation(int x, int y, Operation op)
{
return op(x, y);
}
}
class Program
{
static int Add(int x, int y)
{
return x + y;
}
static int Multiply(int x, int y)
{
return x * y;
}
static void Main()
{
Calculator calc = new Calculator();
// Создание делегата для метода Add и вызов через метод PerformOperation
Operation addOp = new Operation(Add);
int result = calc.PerformOperation(5, 6, addOp);
Console.WriteLine("Addition: " + result);
// Создание делегата для метода Multiply и вызов через метод PerformOperation
Operation mulOp = new Operation(Multiply);
result = calc.PerformOperation(5, 6, mulOp);
Console.WriteLine("Multiplication: " + result);
}
}
Ставь 👍 и забирай 📚 Базу знаний5 014
🔥 Скрытые вакансии с удаленной работой для C# разработчика, которые нигде больше не публикуются. Напрямую от компаний, с контактами рекрутеров.
🔹 C# .NET Jobs | Вакансии
🔹 Unity Jobs | Вакансии
🔸 Все каналы с вакансиями
5 014
Аренда стойки под ваш сервер в ЦОД Cloud4Y
Это решение для бизнеса, которому важны стабильность, контроль и безопасность ИТ-инфраструктуры.
Кому подойдёт решение:
• IT-компаниям, разработчикам ПО и SaaS-сервисов;
• Системным интеграторам;
• Организациям с чувствительными данными;
• Бизнесу с действующими физическими серверами;
• Компаниям, использующим лицензии, привязанные к «железу»;
• Для резервного копирования и бэкап-серверов
Что вы получаете:
— Размещение оборудования в сертифицированном ЦОД (Tier III);
— Круглосуточный доступ (физический и удалённый), охрана, система видеонаблюдения;
— Резервированное электропитание и климат-контроль;
— Аренда юнитов или всего стойко-места;
— Техническая поддержка 24/7;
— Поддержка при установке, консультации по подключению.
Cloud4Y – инфраструктура, которой можно доверять.
Узнать цену
#реклама 16+
cloud4y.ru
О рекламодателе
5 014
🤔 Какую проблему решает ThreadPool?
ThreadPool (пул потоков) решает проблему частого создания и уничтожения потоков, которое дорого по ресурсам.
Проблемы, которые он решает:
- Производительность (не тратится время на создание потока)
- Утилизация ресурсов
- Масштабируемость при высокой нагрузке
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 014
🤔 Что такое инверсия зависимостей?
Инверсия зависимостей — это принцип SOLID, который говорит:
> Модули верхнего уровня не должны зависеть от модулей нижнего уровня. Оба должны зависеть от абстракций.
Это значит, что вместо жёстких зависимостей на конкретные классы, код должен работать через абстракции (
interface или abstract class).
🚩Проблема без инверсии зависимостей
Допустим, у нас есть класс EmailSender, который отправляет письма:
public class EmailSender
{
public void Send(string message)
{
Console.WriteLine($"Отправка email: {message}");
}
}
public class NotificationService
{
private EmailSender _emailSender = new EmailSender();
public void Notify(string message)
{
_emailSender.Send(message);
}
}
🚩Решение: Инверсия зависимостей
Чтобы избавиться от жёсткой зависимости, вводим абстракцию (IMessageSender):
public interface IMessageSender
{
void Send(string message);
}
public class EmailSender : IMessageSender
{
public void Send(string message)
{
Console.WriteLine($"Отправка email: {message}");
}
}
public class SmsSender : IMessageSender
{
public void Send(string message)
{
Console.WriteLine($"Отправка SMS: {message}");
}
}
Теперь NotificationService зависит не от конкретного класса, а от интерфейса:
public class NotificationService
{
private readonly IMessageSender _messageSender;
public NotificationService(IMessageSender messageSender)
{
_messageSender = messageSender;
}
public void Notify(string message)
{
_messageSender.Send(message);
}
}
Теперь мы можем подставлять любую реализацию IMessageSender:
var emailNotifier = new NotificationService(new EmailSender());
emailNotifier.Notify("Привет через Email!");
var smsNotifier = new NotificationService(new SmsSender());
smsNotifier.Notify("Привет через SMS!");
Вывод
Отправка email: Привет через Email! Отправка SMS: Привет через SMS!🚩Преимущества инверсии зависимостей Гибкость – можно легко заменять зависимости. Тестируемость – можно подставить Mock-объект вместо
EmailSender.
Меньше изменений в коде – можно добавить новые способы отправки сообщений без изменения NotificationService.
Ставь 👍 и забирай 📚 Базу знаний5 014
Бесплатный курс по дизайну в FIGMA от Yudaev School
Онлайн-программа с наставником и чатом.
Внимание! 80% практики.
✅По результату обучения у вас будет портфолио из нескольких работ.
✅Сертификат о прохождении курса.
✅Возможность пройти полное обучение и получить карьерное сопровождение!
Учитесь дизайну у профессионалов в Yudaev Shool.
Переходи по кнопки: "Подробнее" и начинай свое обучение.
Доступ 0 руб.
Узнать больше
#реклама 16+
yudaevschool24.online
О рекламодателе
5 014
🤔 Для чего используют асинхронность?
Асинхронность позволяет выполнять операции без блокировки основного потока, что особенно важно для долгих операций, таких как сетевые запросы или чтение/запись данных.
1. Улучшает отзывчивость пользовательского интерфейса.
2. Повышает производительность за счёт параллельного выполнения задач.
3. Экономит системные ресурсы, избегая создания лишних потоков.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 014
🤔 Расскажи про конкурентные коллекции?
Конкурентные коллекции — это специализированные коллекции, которые обеспечивают безопасное выполнение операций в многопоточной среде. В стандартной библиотеке .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}");
}
Ставь 👍 и забирай 📚 Базу знаний5 014
🦈 Открытое собеседование на Middle C# | 6 октября, 19:00 МСК
Приглашаем на открытое собеседование: Senior C# разработчик проведёт его в прямом эфире. Можно посмотреть, как всё устроено изнутри, и понять, насколько ты готов к такому интервью.
Как это будет:
📂 Собеседует Александр Моргунов — Senior C# разработчик, 7+ лет в европейских высоконагруженных сервисах. Отвечает разработчик-доброволец;
📂 Всё как на настоящем собесе: Александр задаёт те вопросы и задачи, которые даёт кандидатам на своих интервью. Заранее их никто не знает;
📂 После каждого ответа Александр даст обратную связь: что прозвучало сильно, а что стоило раскрыть иначе. Так станет понятнее, на что обращают внимание на собесе;
📂 В конце можно задать любой вопрос.
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для C# разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходи в нашего бота, чтобы получить ссылку на эфир -> @shortcut_csharp_bot
Реклама.
О рекламодателе.
5 014
Авторизованные курсы по оборудованию Eltex от дилера №1
Проводим учебные курсы, включающие практические занятия и лабораторные работы.
По итогу успешной сдачи экзаменов обучающемуся выдаётся официальный сертификат от завода Eltex.
⚡Обучение в офисе или онлайн
⚡Опытный преподавательский состав
⚡Лабораторные работы - 50% времени
⚡Обучение юридических и физических лиц
Записаться
#реклама 16+
eltexcm.ru
О рекламодателе
