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

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

رفتن به کانال در Telegram

Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @sendme_ads

نمایش بیشتر
5 008
مشترکین
-324 ساعت
+117 روز
+1030 روز
آرشیو پست ها
Аренда стойки под ваш сервер в ЦОД Cloud4Y Это решение для бизнеса, которому важны стабильность, контроль и безопасность ИТ-и
Аренда стойки под ваш сервер в ЦОД Cloud4Y Это решение для бизнеса, которому важны стабильность, контроль и безопасность ИТ-инфраструктуры. Кому подойдёт решение: • IT-компаниям, разработчикам ПО и SaaS-сервисов; • Системным интеграторам; • Организациям с чувствительными данными; • Бизнесу с действующими физическими серверами; • Компаниям, использующим лицензии, привязанные к «железу»; • Для резервного копирования и бэкап-серверов Что вы получаете: — Размещение оборудования в сертифицированном ЦОД (Tier III); — Круглосуточный доступ (физический и удалённый), охрана, система видеонаблюдения; — Резервированное электропитание и климат-контроль; — Аренда юнитов или всего стойко-места; — Техническая поддержка 24/7; — Поддержка при установке, консультации по подключению. Cloud4Y – инфраструктура, которой можно доверять. Узнать цену #реклама 16+ cloud4y.ru О рекламодателе

🤔 Какую проблему решает ThreadPool? ThreadPool (пул потоков) решает проблему частого создания и уничтожения потоков, которое дорого по ресурсам. Проблемы, которые он решает: - Производительность (не тратится время на создание потока) - Утилизация ресурсов - Масштабируемость при высокой нагрузке Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое инверсия зависимостей? Инверсия зависимостей — это принцип 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. Ставь 👍 и забирай 📚 Базу знаний

Бесплатный курс по дизайну в FIGMA от Yudaev School Онлайн-программа с наставником и чатом. Внимание! 80% практики. ✅По результату обучения у вас будет портфолио из нескольких работ. ✅Сертификат о прохождении курса. ✅Возможность пройти полное обучение и получить карьерное сопровождение! Учитесь дизайну у профессионалов в Yudaev Shool. Переходи по кнопки: "Подробнее" и начинай свое обучение. Доступ 0 руб. Узнать больше #реклама 16+ yudaevschool24.online О рекламодателе

🤔 Для чего используют асинхронность? Асинхронность позволяет выполнять операции без блокировки основного потока, что особенно важно для долгих операций, таких как сетевые запросы или чтение/запись данных. 1. Улучшает отзывчивость пользовательского интерфейса. 2. Повышает производительность за счёт параллельного выполнения задач. 3. Экономит системные ресурсы, избегая создания лишних потоков. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Расскажи про конкурентные коллекции? Конкурентные коллекции — это специализированные коллекции, которые обеспечивают безопасное выполнение операций в многопоточной среде. В стандартной библиотеке .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}");
}
Ставь 👍 и забирай 📚 Базу знаний

🦈 Открытое собеседование на Middle C# | 6 октября, 19:00 МСК Приглашаем на открытое собеседование: Senior C# разработчик про
🦈 Открытое собеседование на Middle C# | 6 октября, 19:00 МСК Приглашаем на открытое собеседование: Senior C# разработчик проведёт его в прямом эфире. Можно посмотреть, как всё устроено изнутри, и понять, насколько ты готов к такому интервью. Как это будет: 📂 Собеседует Александр Моргунов — Senior C# разработчик, 7+ лет в европейских высоконагруженных сервисах. Отвечает разработчик-доброволец; 📂 Всё как на настоящем собесе: Александр задаёт те вопросы и задачи, которые даёт кандидатам на своих интервью. Заранее их никто не знает; 📂 После каждого ответа Александр даст обратную связь: что прозвучало сильно, а что стоило раскрыть иначе. Так станет понятнее, на что обращают внимание на собесе; 📂 В конце можно задать любой вопрос. Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для C# разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы. Переходи в нашего бота, чтобы получить ссылку на эфир -> @shortcut_csharp_bot Реклама. О рекламодателе.

Авторизованные курсы по оборудованию Eltex от дилера №1 Проводим учебные курсы, включающие практические занятия и лабораторны
Авторизованные курсы по оборудованию Eltex от дилера №1 Проводим учебные курсы, включающие практические занятия и лабораторные работы. По итогу успешной сдачи экзаменов обучающемуся выдаётся официальный сертификат от завода Eltex. ⚡Обучение в офисе или онлайн ⚡Опытный преподавательский состав ⚡Лабораторные работы - 50% времени ⚡Обучение юридических и физических лиц Записаться #реклама 16+ eltexcm.ru О рекламодателе

🤔 Что такое куки и где оно хранится в запросе? Это небольшие файлы данных, хранящиеся на стороне клиента и отправляемые серверу с каждым запросом. 1. Они содержатся в заголовке HTTP-запроса (Cookie). 2. Используются для хранения сессий, предпочтений пользователя и другой информации. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Как браузер отправляет запрос и получает ответ от API? Когда браузер отправляет запрос и получает ответ от API, это включает несколько шагов, которые следуют HTTP-протоколу. Этот процесс включает в себя создание и отправку HTTP-запроса, обработку на сервере и получение HTTP-ответа. 🚩Отправка запроса 🟠Инициация запроса Обычно запрос инициируется через JavaScript с использованием встроенных функций, таких как XMLHttpRequest, fetch или сторонние библиотеки, такие как Axios.
   fetch('https://api.example.com/data', {
       method: 'GET',
       headers: {
           'Content-Type': 'application/json',
           'Authorization': 'Bearer token'
       }
   })
   .then(response => response.json())
   .then(data => console.log(data))
   .catch(error => console.error('Error:', error));
   
🟠Формирование HTTP-запроса Метод: Указывает тип запроса (например, GET, POST, PUT, DELETE). URL: Указывает на какой URL отправляется запрос. Заголовки (Headers): Включают информацию о типе содержимого, авторизации и других метаданных. Тело (Body): Содержит данные, которые отправляются с запросом (для методов POST, PUT и PATCH). 🟠Отправка запроса Браузер использует сетевые протоколы для отправки сформированного HTTP-запроса на указанный сервер через интернет. 🚩Обработка запроса на сервере 1⃣Получение запроса Сервер получает HTTP-запрос. 2⃣Обработка запроса Сервер обрабатывает запрос, выполняя соответствующие действия, такие как чтение данных из базы данных, выполнение логики приложения или взаимодействие с другими сервисами. 3⃣Формирование ответа Статус код (Status Code): Указывает результат обработки запроса (например, 200 OK, 404 Not Found, 500 Internal Server Error). Заголовки (Headers): Могут включать метаданные о содержимом ответа, кэшировании и других параметрах. Тело (Body): Содержит данные, которые отправляются обратно клиенту, часто в формате JSON или XML.
   HTTP/1.1 200 OK
   Content-Type: application/json
   Content-Length: 85

   {
       "id": 1,
       "name": "Example",
       "description": "This is an example response"
   }
   
🚩Получение ответа 1⃣Получение ответа Браузер получает HTTP-ответ от сервера. 2⃣Обработка ответа Статус код: Браузер или JavaScript-код проверяет статус код, чтобы определить, был ли запрос успешным. Заголовки: Заголовки могут быть использованы для получения дополнительной информации о ответе. Тело: Браузер разбирает тело ответа, если это необходимо, например, преобразует JSON-данные в объект JavaScript. 3⃣Использование данных Полученные данные могут быть использованы в приложении для обновления интерфейса пользователя, хранения в локальном хранилище или выполнения других действий. 🚩Пример полного цикла запроса и ответа Отправка запроса
fetch('https://api.example.com/data', {
    method: 'GET',
    headers: {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer token'
    }
})
.then(response => {
    if (!response.ok) {
        throw new Error('Network response was not ok ' + response.statusText);
    }
    return response.json();
})
.then(data => {
    console.log('Data received:', data);
    // Используем данные для обновления UI или других целей
})
.catch(error => {
    console.error('There has been a problem with your fetch operation:', error);
});
Ставь 👍 и забирай 📚 Базу знаний

Ключевое ИБ-событие года SOC Forum — одно из крупнейших событий в сфере ИБ, которое проходит в рамках Российской недели кибер
Ключевое ИБ-событие года SOC Forum — одно из крупнейших событий в сфере ИБ, которое проходит в рамках Российской недели кибербезопасности. ✅ Здесь встречаются эксперты, представители бизнеса и госструктур, чтобы обсудить ключевые вызовы отрасли. Событие, которое нельзя пропустить. Для тех, кто не может присутствовать лично, будет запущена онлайн-трансляция: 👌 Переключайтесь между залами. 👌 Выбирайте только актуальные для вас выступления. 👌 Задавайте вопросы спикерам в прямом эфире. 👌 Участвуйте в интерактивах. И все это не выходя из дома. Зарегистрируйтесь, и мы напомним о старте трансляции и пришлем ссылку, чтобы вы ничего не пропустили. Узнать больше #реклама 16+ registration.forumsoc.ru О рекламодателе

🤔 В чём разница между var и dynamic? - var — тип определяется на этапе компиляции. После компиляции он получает конкретный тип. Статическая типизация. - dynamic — тип определяется во время выполнения. Ошибки типа могут проявиться только в рантайме. var безопаснее, dynamic гибче, но требует осторожности. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 В каком случае использовать интерфейс, в каком абстрактный класс? Выбор между интерфейсом и абстрактным классом в C# зависит от нескольких факторов, таких как потребности в наследовании, степень общности, возможность множественного наследования и необходимость реализации по умолчанию. 🚩Когда использовать интерфейсы 🟠Множественное наследование Класс может реализовывать несколько интерфейсов, но наследоваться только от одного класса. Используйте интерфейсы, когда требуется множественное наследование.
public interface IDriveable
{
void Drive();
}

   public interface IFlyable
   {
   void Fly();
   }

public class FlyingCar : IDriveable, IFlyable
{
public void Drive() { /* Реализация вождения */ }
public void Fly() { /* Реализация полета */ }
}
🟠Общее поведение без реализации Используйте интерфейсы, чтобы определить общий набор методов и свойств без предоставления какой-либо реализации. Это позволяет разным классам реализовать интерфейс по-своему.
public interface IShape
{
double GetArea();
}

public class Circle : IShape
{
public double Radius { get; set; }
public double GetArea() => Math.PI * Radius * Radius;
}

public class Rectangle : IShape
{
public double Width { get; set; }
public double Height { get; set; }
public double GetArea() => Width * Height;
}
🟠Гибкость и полиморфизм Интерфейсы позволяют легко менять реализацию и обеспечивают гибкость в коде. Можно использовать интерфейсы для создания полиморфных коллекций или методов, которые работают с разными реализациями интерфейсов.
public void DrawShapes(IEnumerable<IShape> shapes)
{
foreach (var shape in shapes)
{
Console.WriteLine($"Area: {shape.GetArea()}");
}
}
🚩Когда использовать 🟠Частичная реализация Используйте абстрактные классы, если вы хотите предоставить некоторую общую реализацию, которую могут использовать подклассы. Абстрактные классы могут содержать как абстрактные, так и не абстрактные методы.
public abstract class Animal
{
public abstract void MakeSound();
public void Sleep() => Console.WriteLine("Sleeping");
}

public class Dog : Animal
{
public override void MakeSound() => Console.WriteLine("Bark");
}
🟠Шаблонный метод Абстрактные классы хорошо подходят для реализации паттерна "Шаблонный метод", где общий алгоритм реализован в абстрактном классе, а конкретные шаги определены в подклассах.
public abstract class Game
{
public void Play()
{
Initialize();
StartPlay();
EndPlay();
}

protected abstract void Initialize();
protected abstract void StartPlay();
protected abstract void EndPlay();
}

public class Football : Game
{
protected override void Initialize() => Console.WriteLine("Football Game Initialized");
protected override void StartPlay() => Console.WriteLine("Football Game Started");
protected override void EndPlay() => Console.WriteLine("Football Game Ended");
}
Ставь 👍 и забирай 📚 Базу знаний

Программируешь? Участвуй в олимпиаде Высшая проба Сделай шаг в IT вместе с Яндексом и ВШЭ — прими участие в олимпиаде по пром
Программируешь? Участвуй в олимпиаде Высшая проба Сделай шаг в IT вместе с Яндексом и ВШЭ — прими участие в олимпиаде по промышленному программированию! Победителям — БВИ или 100 баллов по профильному предмету в лучших вузах России. Регистрируйся до 20 октября! Узнать больше #реклама olymp.hse.ru О рекламодателе

🤔 Что занимает меньше памяти: класс или структура? Структура (значимый тип) занимает меньше памяти, потому что: - Хранится в стеке или внутри другого объекта, без дополнительной накладной информации. - Не требует хранения метаданных о типе, как у класса. - Не использует сборщик мусора (GC) для удаления. Однако слишком большие или часто копируемые структуры могут быть менее эффективны. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Какая есть классификация у кучи? В информатике и программировании куча (heap) может классифицироваться по нескольким критериям. Рассмотрим основные виды: 🟠По назначению: Куча памяти (Memory Heap) Используется для динамического выделения памяти в приложениях. В C# это управляется сборщиком мусора (GC - Garbage Collector). Примеры: объекты, созданные с помощью new, выделяются в управляемой куче. 🟠Структура данных «Куча» (Heap Data Structure) Это специальная бинарная структура данных, используемая в алгоритмах, например, в сортировке (Heap Sort) или в приоритетных очередях. Бывает максимальная куча (max-heap) и минимальная куча (min-heap). 🚩По типу управления памятью (для кучи памяти в языках программирования): 🟠Управляемая куча (Managed Heap) В C# и .NET память выделяется и освобождается автоматически с помощью GC. Разделяется на поколения (Generation 0, 1, 2), что оптимизирует работу сборщика мусора. 🟠Неуправляемая куча (Unmanaged Heap) Применяется в C/C++ и низкоуровневом коде, где управление памятью выполняется вручную (malloc/free, new/delete). В C# тоже можно работать с ней через Marshal или Unsafe код. 🟠По структуре данных (Heap Data Structure): 🟠Максимальная куча (Max Heap) Корневой узел содержит наибольшее значение, а дочерние узлы – меньшее. Используется в алгоритмах приоритетных очередей. 🟠Минимальная куча (Min Heap) Корневой узел содержит наименьшее значение, а дочерние узлы – большее. Применяется в алгоритме Дейкстры и других задачах.
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        PriorityQueue<int, int> minHeap = new PriorityQueue<int, int>();

        minHeap.Enqueue(5, 5);
        minHeap.Enqueue(3, 3);
        minHeap.Enqueue(8, 8);
        minHeap.Enqueue(1, 1);

        while (minHeap.Count > 0)
        {
            Console.WriteLine(minHeap.Dequeue()); // Выведет: 1, 3, 5, 8
        }
    }
}
Ставь 👍 и забирай 📚 Базу знаний

Открытый урок: бизнес-логика в микросервисах Разработка в микросервисах — это не только разбиение на сервисы, но и грамотное
Открытый урок: бизнес-логика в микросервисах Разработка в микросервисах — это не только разбиение на сервисы, но и грамотное распределение логики. 22 октября в 19:00 мск — открытый урок для разработчиков и архитекторов. Узнаете, где должна жить бизнес-логика. Запишитесь! Зарегистрироваться #реклама 16+ otus.ru О рекламодателе

🤔 Какие есть виды приведения типов? 1. Явное (explicit) — требует указания типа вручную. Может привести к ошибке времени выполнения. 2. Неявное (implicit) — происходит автоматически, когда не теряется информация. 3. Пользовательское (custom) — через оператор operator или as/is. 4. Boxing/Unboxing — упаковка значимых типов в объект и обратно. 5. Приведение интерфейсов/наследования — преобразование к базовому или интерфейсному типу. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Можно ли generic методы использовать не в generic классах? Да, можно! Обобщённые (generic) методы могут существовать в обычных (не-generic) классах. 🚩Как это работает? Generic-метод — это метод, у которого тип параметра задаётся при вызове, даже если сам класс не является обобщённым. Пример: Обобщённый метод в обычном классе
public class Utils
{
    public static void Print<T>(T value) // Обобщённый метод
    {
        Console.WriteLine($"Тип: {typeof(T)}, Значение: {value}");
    }
}

class Program
{
    static void Main()
    {
        Utils.Print(100);      // Тип: System.Int32, Значение: 100
        Utils.Print("Hello");  // Тип: System.String, Значение: Hello
        Utils.Print(3.14);     // Тип: System.Double, Значение: 3.14
    }
}
Ставь 👍 и забирай 📚 Базу знаний

REKONFA: что интересного вас ждёт 15 октября 15 октября встречаемся на REKONFA — большой конференции Яндекс Рекламы. На сцене: — Глеб Доброрадных — о рекламном рынке и эффективности в сложных условиях — Алексей Штоколов — о новых продуктах и технологиях — Лиза Смирнова — о 360°-форматах и новых точках контакта — Александр Пушной — о человеке и ИИ — Александр Умаров — о персональном подходе, который помогает влюблять клиентов в бренд — Яна Чурикова — об актуальных задачах предпринимателей — Татьяна Мужицкая — о целях и энергии — Антон Беляев — об индивидуальности и проектах, которые любят зрители Вне сцены — зона продуктов Яндекс Рекламы, три игры, викторина, зоны Яндекс Ярда и eLama и нетворкинг. 15 октября, Москва, ВТБ Арена и онлайн. Участие бесплатное. Зарегистрироваться #реклама 16+ ya.rekonfa.ru О рекламодателе