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

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

رفتن به کانال در Telegram
5 063
مشترکین
-324 ساعت
-57 روز
-1230 روز
آرشیو پست ها
🤔 Какие типы данных можно использовать у Dictionary в качестве ключа? В C# ключ (TKey) в Dictionary<TKey, TValue> должен быть уникальным и поддерживать сравнение. Лучше всего использовать неизменяемые (immutable) типы, такие как: Примитивные типы (int, string, char, bool, Guid, enum) Кортежи (Tuple, ValueTuple) Неизменяемые структуры (struct, если переопределён Equals и GetHashCode) 🚩Какие типы подходят в качестве ключа? Числовые типы (int, double, long)
var dict = new Dictionary<int, string>
{
    {1, "Один"},
    {2, "Два"}
};
Console.WriteLine(dict[1]); // Вывод: Один
string (лучший выбор)
var dict = new Dictionary<string, int>
{
    {"apple", 10},
    {"banana", 5}
};
Console.WriteLine(dict["apple"]); // 10
Guid (уникальные идентификаторы)
var dict = new Dictionary<Guid, string>
{
    {Guid.NewGuid(), "User1"},
    {Guid.NewGuid(), "User2"}
};
enum (хороший вариант)
enum Status { New, Processing, Completed }

var dict = new Dictionary<Status, string>
{
    {Status.New, "Заказ создан"},
    {Status.Processing, "Заказ в обработке"}
};
Можно использовать несколько значений в качестве ключа:
var dict = new Dictionary<(int, string), string>
{
    {(1, "apple"), "Красное яблоко"},
    {(2, "banana"), "Жёлтый банан"}
};
Console.WriteLine(dict[(1, "apple")]); // Красное яблоко
🚩Какие типы нельзя использовать в качестве ключа? List<T> (и другие изменяемые коллекции)
var dict = new Dictionary<List<int>, string>(); // Ошибка при использовании в качестве ключа!
class, если не переопределён Equals и GetHashCode
class Person { public string Name; }
var dict = new Dictionary<Person, string>(); // Плохо!
Нужно переопределить Equals и GetHashCode
class Person
{
    public string Name { get; }

    public Person(string name) => Name = name;

    public override bool Equals(object? obj)
    {
        return obj is Person other && Name == other.Name;
    }

    public override int GetHashCode() => Name.GetHashCode();
}
Ставь 👍 и забирай 📚 Базу знаний

Сезон скидок для неё Думаете, что выбрать на 8 марта? Зачем выбирать, когда на Wildberries скидки до 60%. Перейти на сайт #реклама wildberries.ru О рекламодателе

🤔 Как реализовать Dictionary, чтобы не использовать ConcurrentDictionary? Если ConcurrentDictionary по каким-то причинам не подходит, можно использовать обычный Dictionary, но при этом: - Оборачивать доступ в lock (монитор), чтобы обеспечить потокобезопасность. - Использовать ReaderWriterLockSlim для более гибкой блокировки чтения/записи. Такой подход требует ручной синхронизации, что сложнее и менее эффективно, чем готовое решение. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Есть ли разница в какой последовательности писать catch-и? Да, порядок catch имеет значение! Исключения проверяются сверху вниз, и первый подходящий catch будет выполнен. 🚩Как работает `catch`? 1. Исключение проверяется по порядку catch-блоков. 2. Если catch подходит → он выполняется, остальные игнорируются. 3. Специфичные исключения (DivideByZeroException) нужно ставить выше общих (Exception). 🚩Ошибка: общий `catch` выше специфичных Так делать нельзя!
try
{
    int x = 5 / 0; // Ошибка
}
catch (Exception ex) // Ловит все исключения
{
    Console.WriteLine("Общая ошибка");
}
catch (DivideByZeroException ex) // Никогда не выполнится!
{
    Console.WriteLine("Деление на ноль!");
}
Правильный порядок catch
try
{
    int x = 5 / 0;
}
catch (DivideByZeroException ex) // Специфичный `catch` первым
{
    Console.WriteLine("Ошибка: деление на ноль!");
}
catch (Exception ex) // Общий `catch` внизу
{
    Console.WriteLine("Произошла ошибка!");
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Если мы используем Ref & Out, то становится ли эта структура ссылочным типом? Нет, структура остаётся значимым типом, но передаётся по ссылке, что позволяет изменять её данные внутри метода. Однако это не делает её ссылочным типом, как класс. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Строки - значимый или ссылочный тип? В C# строки (string) являются ссылочным типом, но ведут себя как значимый тип из-за своей неизменяемости (immutability). 🚩`string` – это ссылочный тип В C# все классы (class) – ссылочные типы, и string не исключение. - Переменная string хранит ссылку на объект в памяти, а не сам текст. - Две переменные могут ссылаться на один и тот же объект.
string str1 = "Hello";
string str2 = str1; // str2 теперь указывает на тот же объект, что и str1
Console.WriteLine(object.ReferenceEquals(str1, str2)); // True
🚩`string` – неизменяемый тип (Immutable) Хотя string – ссылочный тип, каждое изменение строки создаёт новый объект в памяти, а не модифицирует существующий.
string str = "Hello";
str += " World"; // Создаётся новый объект в памяти
🚩Почему `string` ведёт себя как значимый тип? Неизменяемость (Immutability) – строка не меняется после создания. Операции со строками создают новые объекты (как копирование значимых типов). Сравнение строк по значению (==), а не по ссылке (как у ссылочных типов). 1210
string s1 = "hello";
string s2 = "hello";
Console.WriteLine(s1 == s2); // True (сравниваются значения, а не ссылки)
Ставь 👍 и забирай 📚 Базу знаний

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

Вы чувствуете? Праздники совсем близко! Что делать уже сейчас:✨ • Соберите в приложении SOKOLOV вишлист с украшениями мечты.
Вы чувствуете? Праздники совсем близко! Что делать уже сейчас:✨ • Соберите в приложении SOKOLOV вишлист с украшениями мечты. • Поделитесь им с близкими — так будет легче угадать ваши желания. • Выбирайте подарки для любимых: для него, для неё, для себя. –69% на всё в SOKOLOV Успейте выполнить весь чек-лист, пока скидка ещё действует! Заказать #реклама 16+ sokolov.ru О рекламодателе

🤔 Какие есть виды привязок данных и когда применяются? Привязка данных (Data Binding) — это механизм, который позволяет автоматически синхронизировать данные между источником (например, моделью) и интерфейсом (например, элементами UI). 🚩Односторонняя привязка (One-Way Binding) Данные идут только в одном направлении: из модели в UI. - Для вывода данных, которые не должны изменяться пользователем - Например, для отображения текущего времени Пример в WPF
<TextBlock Text="{Binding UserName}" />
🚩Двусторонняя привязка (Two-Way Binding) Данные синхронизируются в обе стороны: UI ↔️ Модель - В формах ввода (например, TextBox), чтобы обновлять данные в модели - Используется в MVVM Пример в WPF
<TextBox Text="{Binding UserName, Mode=TwoWay}" />
🚩Привязка к событиям (Event Binding) Позволяет связывать UI с методами обработки событий. - Для обработки кнопок (Button.Click) - В реактивных фреймворках (Blazor, WinForms) Пример в Blazor
<button @onclick="IncrementCount">Добавить</button>

@code {
    private int count = 0;
    private void IncrementCount() => count++;
}
🚩Привязка к командам (Command Binding) Используется в паттерне MVVM вместо событий - В WPF и Xamarin - Позволяет отделить логику от UI Пример в WPF
<Button Content="Сохранить" Command="{Binding SaveCommand}" />
🚩Привязка к коллекциям (ItemsSource Binding) Позволяет привязывать списки к элементам UI (ListBox, DataGrid) - В списках, таблицах, дропдаунах Пример в WPF
<ListBox ItemsSource="{Binding Users}" DisplayMemberPath="Name" />
Ставь 👍 и забирай 📚 Базу знаний

Компания ДОМКОМ. Окна «РЕХАУ». Приглашаем дилеров Компания «ДОМКОМ» — ведущий производитель окон и дверей из ПВХ профиля «РЕХ
Компания ДОМКОМ. Окна «РЕХАУ». Приглашаем дилеров Компания «ДОМКОМ» — ведущий производитель окон и дверей из ПВХ профиля «РЕХАУ», тёплого и холодного алюминия. Наши производственные возможности позволяют качественно выполнять заказы с высокими техническими требованиями, которые невозможно обеспечить на обычном оборудовании. Изготавливаем мультифункциональные стеклопакеты с заданными свойствами. В эти дни мы проводим акцию: закажите комплексное остекление с отделкой балкона или лоджии и получите конвектор в подарок! Выбирая нас, вы получаете надёжность, качество и гарантию. Приглашаем дилеров! Перейти на сайт #реклама oknadomkom.ru О рекламодателе

🤔 Что бывает, когда количества подключений не хватает? Когда лимит подключений к базе данных превышен: 1. Запросы начинают блокироваться, вызывая задержки. 2. Сервер может возвращать ошибки подключения. 3. Производительность приложения резко снижается. Решение: увеличить лимит подключений или оптимизировать запросы. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Конструкционный профиль от производителя. Всё для алюминиевых конструкций любого масштаба: от станков до торгового оборудования. Алюминиевый конструкционный профиль от производителя. Варианты покрытия профиля: • Серебряное анодирование • Черное анодирование • Без покрытия ⚡ Любая длина и конфигурация! Режем точно в ваш размер. ⚡ Более 100 видов сечений на любой случай. ⚡ Собирайте быстро и чисто, без сварки, покраски и сверления! Идеально для: • 3D-принтеров и станков ЧПУ • Производственных линий • Стеллажей и рам 📞+7 (495) 236-95-55 💻 https://soberizavod.ru Перейти на сайт #реклама soberizavod.ru О рекламодателе

🤔 Какие есть способы (протоколы) обмена данными между сервером и клиентом? При взаимодействии клиента и сервера используются различные*протоколы обмена данными, в зависимости от задачи, скорости, надежности и реального времени. 🚩HTTP(S) – стандартный протокол веба Клиент (браузер, мобильное приложение) делает запрос к серверу. Сервер отправляет ответ с данными (HTML, JSON, XML). Использует методы: GET, POST, PUT, DELETE и т. д.
fetch('https://api.example.com/data')
  .then(response => response.json())
  .then(data => console.log(data));
🚩WebSocket – двусторонняя связь в реальном времени Клиент устанавливает постоянное соединение с сервером. Сервер и клиент могут отправлять друг другу данные в любое время. Используется для чата, онлайн-игр, бирж, обновлений в реальном времени.
const socket = new WebSocket('wss://example.com/socket');

socket.onopen = () => socket.send('Привет, сервер!');
socket.onmessage = event => console.log('Сообщение от сервера:', event.data);
🚩SSE (Server-Sent Events) – поток данных от сервера Клиент делает HTTP-запрос, но соединение не закрывается. Сервер постепенно отправляет данные в виде событий (event-stream). Используется для новостей, биржевых данных, уведомлений.
const eventSource = new EventSource('/events');

eventSource.onmessage = event => console.log('Новое сообщение:', event.data);
🚩gRPC – быстрый RPC поверх HTTP/2 Клиент вызывает удаленные методы напрямую как обычные функции. Работает на HTTP/2, использует бинарный формат Protocol Buffers (быстрее, чем JSON). Используется для высокопроизводительных API, микросервисов.
import grpc
import my_service_pb2
import my_service_pb2_grpc

channel = grpc.insecure_channel('localhost:50051')
stub = my_service_pb2_grpc.MyServiceStub(channel)
response = stub.MyMethod(my_service_pb2.MyRequest(name="Alice"))
print(response.message)
🚩MQTT – лёгкий протокол для IoT Работает по модели издатель/подписчик. Клиент подписывается на тему (topic) и получает сообщения, когда кто-то публикует данные. Используется для умных устройств, датчиков, IoT.
const mqtt = require('mqtt');
const client = mqtt.connect('mqtt://broker.hivemq.com');

client.on('connect', () => {
    client.subscribe('myTopic');
    client.publish('myTopic', 'Привет, MQTT!');
});

client.on('message', (topic, message) => {
    console.log(`Сообщение из ${topic}: ${message.toString()}`);
});
Ставь 👍 и забирай 📚 Базу знаний

Новый HONOR X8d на Яндекс Маркете Новый HONOR X8d Стильный смартфон с мощным аккумулятором Перейти на сайт #реклама market.ya
Новый HONOR X8d на Яндекс Маркете Новый HONOR X8d Стильный смартфон с мощным аккумулятором Перейти на сайт #реклама market.yandex.ru О рекламодателе

🤔 Что такое многопоточность? Многопоточность — это возможность выполнения нескольких потоков (threads) одновременно в одной программе. В C# многопоточность поддерживается с помощью класса `Thread`, задач (`Task`) и `ThreadPool`. Многопоточность используется для выполнения параллельных операций, таких как обработка данных или выполнение задач, которые не должны блокировать основной поток. Она помогает повысить производительность, но требует осторожности для предотвращения гонок данных и взаимоблокировок. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое lock-еры? lock используется для управления доступом к ресурсам в многопоточных приложениях. Это предотвращает возникновение проблем, связанных с одновременным доступом нескольких потоков к одному и тому же ресурсу, что может привести к непредсказуемому поведению или коррупции данных. 🚩Как это работает? Принимает в качестве параметра объект, который используется в качестве мьютекса (взаимоисключающего объекта). Во время выполнения блока кода внутри lock, текущий поток "захватывает" мьютекс. Если другой поток попытается войти в заблокированный участок кода, используя тот же мьютекс, он будет приостановлен до тех пор, пока первый поток не завершит выполнение блока lock и не освободит мьютекс.
public class Account
{
    private decimal balance;
    private readonly object balanceLock = new object();

    public void Deposit(decimal amount)
    {
        lock (balanceLock)
        {
            balance += amount;
        }
    }

    public void Withdraw(decimal amount)
    {
        lock (balanceLock)
        {
            if (balance >= amount)
            {
                balance -= amount;
            }
        }
    }
}
🚩Зачем это нужно? Без использования lock или других методов синхронизации, программы с многопоточным доступом к общим данным могут испытывать проблемы, такие как гонки и условия гонки (race conditions), когда порядок или время доступа к данным может привести к ошибкам или неожиданным результатам. lock гарантирует, что только один поток может исполнять определенный блок кода, работающий с критическими ресурсами, в любой момент времени. Ставь 👍 и забирай 📚 Базу знаний

Ищу желающих заполнять карточки товаров на ВБ! Работа полностью на удаленке с зп до 150 000 рублей в месяц. Без опыта, нужен
Ищу желающих заполнять карточки товаров на ВБ! Работа полностью на удаленке с зп до 150 000 рублей в месяц. Без опыта, нужен только телефон, занятость 3-6 часов в день. Всему обучат на бесплатном курсе и после возьму на работу: ✅ 3 дня уроков по 30 минут ✅ Домашки с проверкой и оплатой бонусами ✅ Плачу 10 тыс за каждую выполненную домашку Все кто пройдет курс, получат сертификат от школы с образовательной лицензией. ⚡ Набор заканчивается завтра. 👍 Для регистрации жмите кнопку "Зарегистрироваться" Зарегистрироваться #реклама 16+ course.wildmanager.ru О рекламодателе

🤔 Для чего используются readonly поля? readonly поля: - могут быть присвоены только при инициализации или в конструкторе; - защищают от изменений после создания объекта; - полезны для неизменяемых зависимостей или константной конфигурации. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

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

Звучит как идеальный старт карьеры в ИТ 6 месяцев работы в связке с топ-менеджером Т-Банка и участие в масштабных проектах компании — все это в программе развития «Мини-CEO». Здесь есть возможность влиять на продукты и получать фидбек от лидеров направлений. А еще построить индивидуальный трек развития карьеры и работать бок о бок с командой в офисе T-Space. Программа подойдет студентам и джуниор-специалистам, которые сильны в математике, аналитике и программировании. Успей подать заявку до 30 марта. Подать заявку #реклама 16+ t-miniceo.ru О рекламодателе