ch
Feedback

不要被骗子欺骗!Telemetrio 会找到并标记这些频道 👉 如果想查看标记,请订阅

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

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

前往频道在 Telegram

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

显示更多
5 009
订阅者
-124 小时
-27 天
+1730 天
帖子存档
15 мая онлайн-презентация новинок Битрикс24 Расскажем о главных иземенениях Битрикс24 в мае 2025 года для работы с командой и продажами. Регистрируйте бесплатно и станьте первыми, кто увидит в прямом эфире все новинки в CRM, AI и совместной работе! Зарегистрироваться #реклама 16+ release.bitrix24.tech О рекламодателе

🤔 Какие есть минусы у boxing/unboxing? Boxing — это преобразование значимого типа в объект (упаковка), unboxing — обратно. Минусы: - Снижение производительности — за счёт дополнительных операций. - Создание мусора — каждый boxing создаёт новый объект в куче. - Потеря типобезопасности — unboxing требует явного указания типа, возможны ошибки во время выполнения. Лучше избегать, особенно в циклах или чувствительных к производительности местах. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Интерполяция - это возможность использовать в строке переменные? Да, интерполяция строк — это удобный способ вставки значений переменных в строку без использования конкатенации (+) или String.Format(). Простой пример интерполяции строк
string name = "Иван";
int age = 25;

string message = $"Привет, меня зовут {name}, и мне {age} лет.";
Console.WriteLine(message);
Вывод
Привет, меня зовут Иван, и мне 25 лет.
🚩Дополнительные возможности интерполяции 🟠Форматирование значений Можно форматировать числа и даты прямо в строке:
double price = 99.99;
DateTime today = DateTime.Now;

string formatted = $"Цена: {price:C}, Дата: {today:dd.MM.yyyy}";
Console.WriteLine(formatted);
Вывод
Цена: 99,99 ₽, Дата: 01.03.2025
🟠Выполнение выражений Можно вставлять даже арифметические операции и вызовы методов:
int a = 10, b = 5;
string mathResult = $"Сумма: {a + b}, Разница: {a - b}";
Console.WriteLine(mathResult);
Вывод
Сумма: 15, Разница: 5
🟠Экранирование фигурных скобок Если нужно вывести {} в тексте, их надо удваивать:
Console.WriteLine($"JSON: {{ \"name\": \"Иван\" }}");
Вывод
JSON: { "name": "Иван" }
Ставь 👍 и забирай 📚 Базу знаний

Почему выбирают PostgreSQL как сервис от РТК-ЦОД? Сервис PostgreSQL от РТК-ЦОД позволяет быстро развернуть, эксплуатировать и
Почему выбирают PostgreSQL как сервис от РТК-ЦОД? Сервис PostgreSQL от РТК-ЦОД позволяет быстро развернуть, эксплуатировать и масштабировать базу данных в облаке. Процесс установки и настройки полностью автоматизирован. Почему выбирают нас? — Личный кабинет — Надежное хранение данных: дата-центры уровня Tier III в России, сертифицированные Uptime Institute — Детальный SLA — Оптимальная конфигурация: выделенный кластер только под вас — Опция администрирования вашей базы данных — Квалифицированная техподдержка в режиме 24х7 ✅ 30 дней бесплатно: тестируйте наш сервис с полным доступом ко всем возможностям. Оставьте заявку на www.cloud.rt.ru Узнать больше #реклама 16+ cloud.rt.ru О рекламодателе

🤔 Какая разница работы асинхронности на C# и JavaScript? В C#: - Асинхронность основана на async/await, Task, ThreadPool. - Может использоваться для как I/O (сетевые запросы), так и CPU-bound операций. - Компилятор генерирует state-machine для управления переходами состояний задачи. - Асинхронность может использовать потоки, но не всегда (например, при I/O — потоки не блокируются вовсе). В JavaScript: - Асинхронность основана на Promise, async/await. - Однопоточная модель с event loop. - Не используется многопоточность, даже если операции асинхронны. - Все I/O происходят через неблокирующий механизм событий. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Какие методы есть в Action фильтре? Используются для выполнения логики до и после выполнения метода действия контроллера. Они предоставляют механизм для выполнения кросс-секционных задач, таких как логирование, обработка исключений, валидация и т.д. Action фильтры реализуют интерфейс IActionFilter или IAsyncActionFilter. 🚩Методы в Action фильтре 🟠OnActionExecuting Этот метод вызывается перед выполнением метода действия. Здесь можно добавить логику, которая будет выполняться до вызова действия, например, логирование или проверка условий.
public void OnActionExecuting(ActionExecutingContext context)
{
    // Логика до выполнения действия
}
🟠OnActionExecuted Этот метод вызывается после выполнения метода действия. Здесь можно добавить логику, которая будет выполняться после вызова действия, например, логирование результатов или модификация ответа.
public void OnActionExecuted(ActionExecutedContext context)
{
    // Логика после выполнения действия
}
🟠OnActionExecutionAsync Этот метод объединяет функциональность OnActionExecuting и OnActionExecuted в одном асинхронном методе. Здесь можно определить логику, которая будет выполняться как до, так и после выполнения метода действия.
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
    // Логика до выполнения действия
       
    var resultContext = await next();
       
    // Логика после выполнения действия
}
🚩Реализации Action фильтра Синхронный Action фильтр:
public class SampleActionFilter : IActionFilter
{
    public void OnActionExecuting(ActionExecutingContext context)
    {
        // Логика до выполнения действия
        Console.WriteLine("Before executing action");
    }

    public void OnActionExecuted(ActionExecutedContext context)
    {
        // Логика после выполнения действия
        Console.WriteLine("After executing action");
    }
}
Асинхронный Action фильтр:
public class SampleAsyncActionFilter : IAsyncActionFilter
{
    public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        // Логика до выполнения действия
        Console.WriteLine("Before executing action");
        
        var resultContext = await next();
        
        // Логика после выполнения действия
        Console.WriteLine("After executing action");
    }
}
🚩Применение Action фильтра Action фильтр можно применять к контроллерам или действиям контроллера с помощью атрибута [ServiceFilter] или [TypeFilter]. Также его можно зарегистрировать глобально в Startup.cs. Применение к контроллеру или действию:
[ServiceFilter(typeof(SampleActionFilter))]
public class HomeController : Controller
{
    public IActionResult Index()
    {
        return View();
    }
}
Глобальная регистрация:
public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers(config =>
    {
        config.Filters.Add(typeof(SampleActionFilter));
    });
}
Ставь 👍 и забирай 📚 Базу знаний

Обнулите все свои кредиты и долги! Долги от 200 000₽. Поможем бесплатно списать долг и расторгнуть все кредитные договоры! По
Обнулите все свои кредиты и долги! Долги от 200 000₽. Поможем бесплатно списать долг и расторгнуть все кредитные договоры! Получить консультацию #реклама нет-кредит.рф О рекламодателе

🤔 Что такое Scoped? Scoped — объект создаётся один раз на каждый HTTP-запрос. Все компоненты в рамках одного запроса получают один и тот же экземпляр, но при следующем запросе создаётся новый. Подходит для работы с данными и контекстом, например, DbContext. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Может ли абстрактный метод быть вне абстрактного класса? Нет, абстрактный метод не может существовать вне абстрактного класса. В 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.
Ставь 👍 и забирай 📚 Базу знаний