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

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

Открыть в Telegram
5 048
Подписчики
-124 часа
-157 дней
-2530 день
Архив постов
🤔 Может ли абстрактный метод быть вне абстрактного класса? Нет, абстрактный метод не может существовать вне абстрактного класса. В C# это ограничение встроено в язык, чтобы поддерживать строгую логику наследования и полиморфизма. 🚩Почему абстрактный метод требует абстрактного класса? Абстрактный метод — это метод, который объявлен, но не имеет реализации. Он выступает как "контракт", который обязан быть реализован в производном классе.
public abstract class Shape
{
    public abstract double CalculateArea();
}
Абстрактные методы имеют следующие особенности: Они не могут содержать тело (реализацию). Их цель — заставить производные классы реализовать конкретную функциональность. Они всегда принадлежат абстрактным классам. 🚩Пример ошибки Если попытаться объявить абстрактный метод в обычном классе, компилятор выдаст ошибку
public class RegularClass
{
    public abstract void SomeMethod(); // Ошибка: абстрактный метод может быть только в абстрактном классе
}
🚩Логика дизайна C# требует, чтобы абстрактные методы находились только в абстрактных классах, потому что: Абстрактные классы могут содержать как абстрактные, так и обычные методы. Это позволяет определять базовое поведение в абстрактном классе и оставлять специфическую реализацию производным классам. Обычные классы не могут содержать абстрактные методы, так как они предназначены для создания объектов, а объект не может содержать "незавершённый" метод. Ставь 👍 и забирай 📚 Базу знаний

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

🤔 Как по ключу получить значение? Для получения значения по ключу в словаре (Dictionary<TKey, TValue>) используются методы и свойства, такие как индексатор [], метод TryGetValue, и метод ContainsKey. 🟠Индексатор `[]` Индексатор позволяет получить значение по ключу напрямую. Если ключ отсутствует в словаре, будет выброшено исключение KeyNotFoundException.
var dictionary = new Dictionary<int, string>
{
    { 1, "One" },
    { 2, "Two" },
    { 3, "Three" }
};

try
{
    string value = dictionary[2]; // Получение значения по ключу 2
    Console.WriteLine(value); // Выведет "Two"
}
catch (KeyNotFoundException)
{
    Console.WriteLine("Key not found");
}
🟠Метод `TryGetValue` Метод TryGetValue позволяет безопасно получить значение по ключу. Он возвращает true, если ключ найден, и false, если ключ отсутствует. При этом значение записывается в выходной параметр.
var dictionary = new Dictionary<int, string>
{
    { 1, "One" },
    { 2, "Two" },
    { 3, "Three" }
};

if (dictionary.TryGetValue(2, out string value))
{
    Console.WriteLine(value); // Выведет "Two"
}
else
{
    Console.WriteLine("Key not found");
}
🟠Метод `ContainsKey` Метод ContainsKey проверяет наличие ключа в словаре. Его можно использовать в сочетании с индексатором для получения значения.
var dictionary = new Dictionary<int, string>
{
    { 1, "One" },
    { 2, "Two" },
    { 3, "Three" }
};

if (dictionary.ContainsKey(2))
{
    string value = dictionary[2];
    Console.WriteLine(value); // Выведет "Two"
}
else
{
    Console.WriteLine("Key not found");
}
Ставь 👍 и забирай 📚 Базу знаний

Дарим подписку на Яндекс Музыку Ответьте на 1 вопрос и Яндекс Музыка ваша для вас и 3-х ваших близких. Кинопоиск и Яндекс Книги тоже в подписке. Попробуйте бесплатно❤️ Попробовать #реклама 18+ music.yandex.ru О рекламодателе Реклама на Яндексе

🤔 Для чего нужно разделение Large Object Heap и Small Object Heap? Разделение позволяет оптимизировать работу сборщика мусора, так как большие объекты редко перемещаются, а их обработка происходит отдельно, минимизируя накладные расходы. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что делать, если есть два интерфейса с одинаковым названием? Если в проекте присутствуют два интерфейса с одинаковым названием, это может привести к конфликту имен. Чтобы избежать этой проблемы, можно использовать несколько решений: 🟠Использование пространств имен (Namespaces) Наиболее очевидное и правильное решение — поместить интерфейсы в разные пространства имен и указывать их при использовании.
namespace FirstNamespace
{
    public interface ILogger
    {
        void Log(string message);
    }
}

namespace SecondNamespace
{
    public interface ILogger
    {
        void LogError(string message);
    }
}
Если в коде требуется использовать оба интерфейса, можно указать полное имя интерфейса
using FirstNamespace;
using SecondNamespace;

class Program
{
    static void Main()
    {
        FirstNamespace.ILogger logger1;
        SecondNamespace.ILogger logger2;
    }
}
🟠Использование псевдонимов для пространств имен Чтобы избежать длинных имен, можно задать псевдонимы:
using FirstLogger = FirstNamespace.ILogger;
using SecondLogger = SecondNamespace.ILogger;

class Program
{
    static void Main()
    {
        FirstLogger logger1;
        SecondLogger logger2;
    }
}
🟠Наследование интерфейсов Если оба интерфейса схожи по функциональности, можно создать общий интерфейс и наследовать его
public interface IBaseLogger
{
    void Log(string message);
}

public interface ILogger1 : IBaseLogger
{
}

public interface ILogger2 : IBaseLogger
{
}
🟠Явная реализация интерфейсов Если класс должен реализовывать оба интерфейса с одинаковыми методами, можно использовать явную реализацию интерфейсов:
using FirstNamespace;
using SecondNamespace;

class Logger : FirstNamespace.ILogger, SecondNamespace.ILogger
{
    void FirstNamespace.ILogger.Log(string message)
    {
        Console.WriteLine("First Logger: " + message);
    }

    void SecondNamespace.ILogger.LogError(string message)
    {
        Console.WriteLine("Second Logger Error: " + message);
    }
}

class Program
{
    static void Main()
    {
        Logger logger = new Logger();
        ((FirstNamespace.ILogger)logger).Log("Hello");
        ((SecondNamespace.ILogger)logger).LogError("Error");
    }
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Интерполяция — это возможность использовать в строке переменные? Да, строковая интерполяция — это способ вставить значение переменной прямо внутрь строки. Это улучшает читаемость, заменяя конкатенацию. Используется как способ встроенного форматирования текста. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Почему вы не используете Битрикс24 CRM с AI? 1- не знал 2- забыл Рассказываем и напоминаем! ✅Битрикс24 CRM с AI помогает увел
+5
Почему вы не используете Битрикс24 CRM с AI? 1- не знал 2- забыл Рассказываем и напоминаем! ✅Битрикс24 CRM с AI помогает увеличивать продажи, работать с постоянными клиентами и сохранять все важные данные. AI-помощник CoPilot внутри сервиса расшифрует телефонные разговоры и автоматически заполнит карточки клиента в CRM. Битрикс24 можно использовать бесплатно для всех команд, независимо от их размера. ⚡Не тратьте время на рутину. Узнать больше #реклама 16+ bitrix24.ru О рекламодателе

🤔 Что такое метод set? Метод set в контексте чаще всего используется в свойствах (properties) класса и служит для установки значения свойства. Он работает как часть автоматического или пользовательского свойства, позволяя контролировать, что происходит, когда свойству присваивается значение. 🚩Что такое свойство? Свойство (property) в C# – это синтаксический сахар, который позволяет обращаться к полям класса как к переменным, но при этом добавляет возможность добавлять логику для получения (get) и установки (set) значений.
public class Person
{
    private string name; // Закрытое поле

    public string Name // Свойство
    {
        get { return name; } // Получить значение
        set { name = value; } // Установить значение
    }
}
🚩Зачем нужен метод `set`? 🟠Контролировать логику установки значений Например, вы можете ограничить, какие значения можно присваивать. 🟠Выполнять дополнительные действия при присваивании Например, логирование или обновление других полей. 🟠Защищать данные Вы можете использовать метод set для проверки значений на валидность или ограничения доступа (например, сделать его приватным). 🚩Пример использования `set` Проверка входных данных:
public class Person
{
    private int age;

    public int Age
    {
        get { return age; }
        set
        {
            if (value < 0)
            {
                throw new ArgumentException("Возраст не может быть отрицательным.");
            }
            age = value;
        }
    }
}
Только для чтения Вы можете сделать set приватным, чтобы свойство можно было только читать извне:
public class Person
{
    public string Name { get; private set; }

    public Person(string name)
    {
        Name = name;
    }
}
Автоматические свойства Если вам не нужна дополнительная логика, можно использовать автоматические свойства
public class Person
{
    public string Name { get; set; } // Автоматически создаются get и set
}
Ставь 👍 и забирай 📚 Базу знаний

Ищешь высокооплачиваемые проекты? Попробуй SkillStaff SkillStaff — это платформа для ИТ-специалистов, менеджеров и креаторов,
Ищешь высокооплачиваемые проекты? Попробуй SkillStaff SkillStaff — это платформа для ИТ-специалистов, менеджеров и креаторов, которым мало одного оклада. Здесь можно найти клиентов, выполнять их проекты и увеличивать свой доход. - Проекты с гибким графиком: part time, full time, удаленка и гибрид - Ставка за час работы — та, что ты сам выбрал - Клиенты — ведущие бренды, проверенные с юридической точки зрения при регистрации на платформе - Оплата поступает ежемесячно на расчетный счет исполнителя - Удобный личный кабинет и функционал, автоматизирующий документооборот Все, что нужно для работы — иметь статус самозанятого или ИП, а платформа поможет со всеми нюансами. Регистрируйся прямо сейчас Зарегистрироваться #реклама 16+ skillstaff.ru О рекламодателе

🤔 Как работает Routing? Это механизм сопоставления URL с соответствующими обработчиками в веб-приложении. 1. Сервер анализирует URL-запроса и перенаправляет его в нужный контроллер или обработчик. 2. Используется в веб-фреймворках (например, ASP.NET, Express.js) для обработки маршрутов. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Зачем нужны поколения для сборщика мусора в JS? В JavaScript (как и в C#) сборщик мусора (Garbage Collector, GC) использует поколения (generational GC) для оптимизации работы с памятью. Это помогает быстрее и эффективнее очищать ненужные объекты, минимизируя задержки в работе программы. 🚩Зачем нужны поколения в GC? 🟠Большинство объектов "живут" недолго В среднем, переменные и объекты в JS создаются и быстро перестают использоваться. Например, временные объекты в функциях. 🟠Некоторые объекты "живут" долго Например, глобальные переменные, кэш данных или объекты в setInterval. 🟠Очистка памяти должна быть быстрой Проверять всю память каждый раз — дорого по времени. GC должен быстро убирать "мусор", не замедляя выполнение кода. 🚩Как работают поколения? JS-движки, например V8 (Chrome, Node.js), используют Generational Garbage Collection — деление объектов на молодые (new generation) и старые (old generation). 🟠Молодое поколение (Young Generation) Сюда попадают новые объекты. GC часто проверяет эту область и быстро очищает. Если объект "выжил" несколько проверок, он переносится в старшее поколение. 🟠Старое поколение (Old Generation) Здесь хранятся "долгоживущие" объекты. Проверяется реже, так как здесь объекты реже становятся мусором. Очистка более сложная и дорогая по времени. Пример работы GC в V8
function createObjects() {
    let obj1 = { name: "temp" }; // попадает в Young Generation
    let obj2 = { data: new Array(1000).fill(0) }; // тоже в Young Generation
}

// После выхода из функции obj1 и obj2 становятся мусором и очищаются GC.
Ставь 👍 и забирай 📚 Базу знаний

🤔 Какие основные свойства и методы IEnumerable? IEnumerable предоставляет: - Возможность перебора элементов в коллекции. - Метод GetEnumerator(), возвращающий итератор. - Поддерживает foreach. IEnumerable<T> используется для отложенного выполнения и однократного прохода по данным. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Какие есть виды привязок данных и когда применяются? Привязка данных (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" />
Ставь 👍 и забирай 📚 Базу знаний

Крупнейший университет искусственного интеллекта Приглашаем на бесплатный однодневный интенсив по AI! Освой искусственный инт
Крупнейший университет искусственного интеллекта Приглашаем на бесплатный однодневный интенсив по AI! Освой искусственный интеллект для профессионального роста: создавай нейросети, автоматизируй бизнес-задачи и зарабатывай на AI-решениях. ✨ 8 000+ студентов со всего мира ✨ 600+ AI-проектов, созданных студентами ✨ Сборная Университета — победители крупнейших AI-хакатонов России ✨ Стажировки в крупнейших компаниях России (РЖД, Ростелеком, РУДН, Совкомбанк, Самолет и другие) ✨ Трудоустраиваем выпускников в крупнейшие компании (Яндекс, ВТБ, Сбербанк, Роскосмос и другие) Будем рады видеть тебя в наших рядах! Узнать больше #реклама 16+ neural-university.ru О рекламодателе

🤔 Какая разница между статичным методом и методом экземпляра? - Статичный метод (static) принадлежит классу, а не объекту: - Вызывается без создания экземпляра. - Не имеет доступа к this, не может использовать нестатичные поля. - Метод экземпляра принадлежит конкретному объекту: - Требует создания экземпляра (new). - Имеет доступ к полям и методам объекта. Пример: Math.Abs() — статичный, myList.Add() — метод экземпляра. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое boxing и unboxing? boxing и unboxing — это два важных процесса, связанных с преобразованием типов между значимыми типами (value types) и ссылочными типами (reference types). Эти процессы играют ключевую роль в работе с обобщенными коллекциями и при взаимодействии между различными частями .NET Framework. 🚩Boxing Это процесс преобразования переменной значимого типа (например, int или struct) в тип object или в любой другой тип интерфейса, реализуемый этим значимым типом. При боксинге переменная значимого типа оборачивается в объект ссылочного типа, и её значение копируется в новый объект на управляемой куче. Это необходимо, потому что все элементы в .NET в конечном итоге должны быть объектами.
int num = 123;
object obj = num;  // Boxing
🚩Unboxing Это обратный процесс, при котором содержимое объекта ссылочного типа преобразуется обратно в значимый тип. Требует явного указания типа, к которому нужно преобразовать, и может вызывать исключение InvalidCastException, если объект не может быть преобразован в желаемый значимый тип.
object obj = 123;  // Boxing
int num = (int)obj;  // Unboxing
🟠Производительность Боксинг и анбоксинг могут негативно сказаться на производительности, поскольку они влекут за собой операции с памятью, включая выделение памяти и сборку мусора. Поэтому рекомендуется минимизировать их использование, особенно в критичных по производительности частях приложения. 🟠Нужда Несмотря на возможное негативное влияние на производительность, боксинг и анбоксинг необходимы для работы со значимыми типами в контекстах, где требуются объекты (например, при работе с коллекциями типа ArrayList). Ставь 👍 и забирай 📚 Базу знаний

Теперь в Битрикс24 есть ещё и онлайн-доски! ✨Весь привычный функционал плюс любимая фича всех прожектов — и это бесплатно. Похоже, скоро офисные стикеры уйдут в отпуск. Узнать больше #реклама 16+ bitrix24.ru О рекламодателе

🤔 Какие механизмы позволяют не нарушать принцип dependency inversion? Для соблюдения принципа dependency inversion используются интерфейсы и абстракции, которые позволяют код зависеть от общего поведения, а не от конкретных реализаций. Также помогают фабрики (Factories) для создания объектов и DI-контейнеры (Dependency Injection), которые управляют зависимостями и их внедрением. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Какая есть классификация у кучи? В информатике и программировании куча (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
        }
    }
}
Ставь 👍 и забирай 📚 Базу знаний