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

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

Kanalga Telegram’da o‘tish
5 038
Obunachilar
-624 soatlar
-167 kunlar
-3030 kunlar
Postlar arxiv
🤔 В чём отличие slim-версий от обычных семафоров? Slim-версии легче и работают быстрее, но только внутри одного процесса. Они экономичнее по ресурсам и поддерживают асинхронное ожидание. Обычные семафоры — более универсальны, но тяжелее и применимы для взаимодействия между разными процессами. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Какие есть методы запросов жизненного цикла в asp.net Core? В ASP.NET Core жизненный цикл запроса проходит несколько этапов — от получения HTTP-запроса до отправки ответа. В этом процессе участвуют Middleware, контроллеры, фильтры и обработчики событий. 🚩Основные этапы жизненного цикла запроса Получение запроса (HttpContext создаётся) Обработка через Middleware (передача запроса вниз) Маршрутизация (Routing) — определение контроллера Фильтры (например, аутентификация) Вызов контроллера и метода (Action) Обратный проход через Middleware (формирование ответа) Отправка ответа клиенту 🚩Методы Middleware (Промежуточное ПО) Middleware — это основной механизм обработки запросов. Где регистрируются? → В Program.csapp.Use...) Методы Middleware
app.Use(async (context, next) =>
{
    Console.WriteLine("Перед обработкой запроса");
    await next(); // Передаём запрос дальше
    Console.WriteLine("После обработки запроса");
});
🚩Методы в контроллерах (`Controller`) Контроллер обрабатывает запросы после маршрутизации. Основные методы
public class HomeController : Controller
{
    // Метод вызывается при GET-запросе
    public IActionResult Index()
    {
        return View();
    }

    // Метод вызывается при POST-запросе
    [HttpPost]
    public IActionResult SubmitForm(FormModel model)
    {
        return RedirectToAction("Index");
    }
}
🚩Фильтры (`Filters`) Фильтры выполняются до и после вызова контроллера. Методы фильтров
public class MyActionFilter : IActionFilter
{
    public void OnActionExecuting(ActionExecutingContext context)
    {
        Console.WriteLine("Перед вызовом метода контроллера");
    }

    public void OnActionExecuted(ActionExecutedContext context)
    {
        Console.WriteLine("После вызова метода контроллера");
    }
}
🚩Методы жизненного цикла в `Program.cs` В ASP.NET Core 6+ вся конфигурация находится в Program.cs. Методы инициализации
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllersWithViews(); // Подключаем MVC

var app = builder.Build();

app.UseRouting(); // Включаем маршрутизацию
app.UseAuthorization(); // Проверка прав
app.UseEndpoints(endpoints =>
{
    endpoints.MapControllers(); // Подключаем контроллеры
});

app.Run();
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое DTO? DTO (Data Transfer Object): - Это простой класс, предназначенный только для передачи данных между слоями (например, между API и сервисом). - Не содержит логики, только поля и свойства. - Часто используется: - при сериализации; - в REST API; - для защиты бизнес-модели от утечек наружу. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Сегодня последний день! Акция на Пожизненный easyoffer PRO - по цене 1 года заканчивается сегодня. PRO подписка включает: – Д
Сегодня последний день! Акция на Пожизненный easyoffer PRO - по цене 1 года заканчивается сегодня. PRO подписка включает: – Доступ ко всем профессиям сайта без ограничений – Все текущие и новые функции, которые будут появляться на сайте 👉 Акция до 31 марта 23:59 по МСК https://easyoffer.ru/pro

🤔 Что такое делегаты и зачем они нужны? Делегаты — это типы, которые безопасно инкапсулируют методы, подобно указателям на функции в других языках программирования, но с проверкой типов во время компиляции. Могут ссылаться на метод, который принимает параметры и возвращает значение. Они используются для реализации обратных вызовов и событий, а также для определения пользовательских операций, которые могут быть выполнены методом, принимаемым в качестве параметра. 🚩Зачем они нужны? 🟠Обратные вызовы (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);
    }
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое middleware в ASP.NET core? Middleware — это компоненты, которые обрабатывают HTTP-запросы и ответы в ASP.NET Core. Каждый компонент middleware может либо обработать запрос, либо передать его следующему компоненту в конвейере. Они используются для выполнения задач, таких как аутентификация, логирование или обработка ошибок. Последовательность middleware определяет поведение приложения и порядок обработки запросов. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Завтра последний день! Успей купить пожизненный easyoffer PRO - по цене 1 года Покупаешь один раз — пользуешься всю жизнь. 👉
Завтра последний день! Успей купить пожизненный easyoffer PRO - по цене 1 года Покупаешь один раз — пользуешься всю жизнь. 👉 Акция до 31 марта: https://easyoffer.ru/pro

🤔 Какова концепция сборки мусора в С#? Это автоматический процесс управления памятью, который освобождает память, занятую объектами, которые больше не используются приложением. Этот механизм помогает разработчикам избежать ошибок, связанных с управлением памятью вручную, таких как утечки памяти и неправильное использование освобожденных ресурсов. 🚩Основные концепции сборки мусора 🟠Управляемая куча (Managed Heap) Управляемая куча — это область памяти, в которой размещаются объекты, созданные в управляемой среде .NET. Когда создается новый объект, память для него выделяется в управляемой куче. 🟠Корни (Roots) Корни — это переменные и ссылки, которые являются начальными точками для сборки мусора. Они включают глобальные и статические переменные, локальные переменные в стеке, а также ссылки из регистров процессора. 🟠Алгоритм маркировки и сжатия (Mark-and-Compact) GC использует алгоритм маркировки и сжатия для определения объектов, которые больше не используются. Сначала он помечает все доступные объекты (те, до которых можно добраться из корней), а затем удаляет все непомеченные объекты, освобождая их память. 🟠Поколения (Generations) Память управляемой кучи разделена на три поколения: поколение 0, поколение 1 и поколение 2. Это позволяет оптимизировать процесс сборки мусора: Поколение 0: Содержит новые объекты. Сборка мусора здесь происходит чаще всего, так как большинство объектов живут недолго. Поколение 1: Содержит объекты, которые пережили одну сборку мусора. Поколение 2: Содержит объекты, которые пережили несколько сборок мусора. Сборка мусора здесь происходит реже всего, так как такие объекты считаются долгоживущими. 🚩Этапы сборки мусора 🟠Инициализация сборки мусора Когда выделяется новая память и управляемая куча достигает определенного порога, запускается процесс сборки мусора. 🟠Маркировка (Mark) GC проходит по всем корням и помечает все объекты, которые могут быть достигнуты. 🟠Удаление (Sweep) После маркировки все непомеченные объекты считаются недоступными и могут быть удалены. 🟠Сжатие (Compact) Для улучшения производительности и уменьшения фрагментации памяти, сборщик мусора может переместить оставшиеся объекты, чтобы освободить блоки памяти.
class Program
{
    static void Main()
    {
        for (int i = 0; i < 1000; i++)
        {
            CreateObject();
        }

        // Явный вызов сборщика мусора (не рекомендуется для обычного использования)
        GC.Collect();
    }

    static void CreateObject()
    {
        MyClass obj = new MyClass();
        // Объект obj будет собран сборщиком мусора, когда он больше не будет использоваться
    }
}

class MyClass
{
    // Поля и методы класса
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Можно ли передать строку в lock? Можно, но не рекомендуется. Строки могут быть разделяемыми между разными частями программы, даже если они написаны одинаково. Это может привести к неожиданным блокировкам. Лучше использовать уникальные объекты, специально созданные для блокировки. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое медиатор? Это паттерн проектирования поведенческих шаблонов, который позволяет уменьшить связанность между объектами, обеспечивая взаимодействие через центральный объект-посредник. Медиатор упрощает коммуникацию между компонентами системы, делая ее более модульной и легкой для сопровождения. 🚩Примеры использования 1⃣Определение интерфейса медиатора
public interface IMediator
{
    void Notify(object sender, string ev);
}   
2⃣Реализация медиатора
public class DialogMediator : IMediator
{
    private Button _button;
    private TextBox _textBox;

    public DialogMediator(Button button, TextBox textBox)
    {
        _button = button;
        _button.SetMediator(this);
        _textBox = textBox;
        _textBox.SetMediator(this);
    }

    public void Notify(object sender, string ev)
    {
        if (ev == "ButtonClick")
        {
            _textBox.Clear();
        }
        else if (ev == "TextBoxEnter")
        {
            _button.SetEnabled(true);
        }
    }
}   
3⃣Компоненты, взаимодействующие через медиатора
public class Button
{
    private IMediator _mediator;
       
    public void SetMediator(IMediator mediator)
    {
        _mediator = mediator;
    }

    public void Click()
    {
        Console.WriteLine("Button clicked");
        _mediator.Notify(this, "ButtonClick");
    }

    public void SetEnabled(bool enabled)
    {
        Console.WriteLine($"Button is {(enabled ? "enabled" : "disabled")}");
    }
}

public class TextBox
{
    private IMediator _mediator;
       
    public void SetMediator(IMediator mediator)
    {
        _mediator = mediator;
    }

    public void EnterText()
    {
        Console.WriteLine("Text entered");
        _mediator.Notify(this, "TextBoxEnter");
    }

    public void Clear()
    {
        Console.WriteLine("TextBox cleared");
    }
}  
4⃣Использование медиатора в приложении
var button = new Button();
var textBox = new TextBox();
var mediator = new DialogMediator(button, textBox);

textBox.EnterText(); // Ввод текста активирует кнопку
button.Click();      // Нажатие кнопки очищает текстовое поле   
🚩Плюсы и минусыСнижение связанности Компоненты не взаимодействуют напрямую, а используют медиатор. ➕Упрощение поддержки Вся логика взаимодействия сосредоточена в одном месте. ➕Повышение модульности Легко добавлять новые компоненты или изменять существующие. ➖Усложнение медиатора Медиатор может стать сложным, если в него добавляется много логики. ➖Единая точка отказа Если медиатор выходит из строя, это может повлиять на всю систему. Ставь 👍 и забирай 📚 Базу знаний

🤔 Какие объекты можно использовать в foreach? В foreach-цикле можно использовать любые объекты, которые реализуют интерфейс IEnumerable (в .NET) или Iterable (в Java). Это могут быть: - массивы; - коллекции (List, Set, Dictionary, ArrayList, и др.); - результат LINQ-запроса; - пользовательские коллекции, если реализуют IEnumerable. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое .NET стандарт? .NET Standard — это спецификация API, которая определяет набор базовых библиотек, доступных во всех реализациях .NET (например, .NET Framework, .NET Core, Xamarin, Unity и других). Она была создана для обеспечения совместимости между разными платформами .NET. 🚩Зачем нужен .NET Standard? До появления .NET Standard существовало несколько отдельных реализаций .NET: .NET Framework (для Windows-приложений) .NET Core (кроссплатформенная версия .NET) Mono/Xamarin (для мобильных и игровых приложений) Каждая из них имела свои особенности и набор доступных API. Из-за этого разработчики, создавая библиотеку, сталкивались с проблемой совместимости: приходилось писать несколько версий кода под разные платформы или использовать Portable Class Library (PCL), которая имела ограниченный функционал. .NET Standard решил эту проблему, введя единый набор API, который обязаны поддерживать все реализации .NET. 🚩Как это работает? .NET Standard представляет собой абстрактную спецификацию API, которая реализуется разными версиями .NET. Например, .NET Standard 2.0 поддерживается в .NET Framework 4.6.1, .NET Core 2.0 и выше. Если библиотека написана под .NET Standard 2.0, её можно использовать во всех этих средах. 🚩Версии .NET Standard Существуют разные версии .NET Standard, каждая из которых включает больше API, чем предыдущая. Чем выше версия, тем больше возможностей, но и тем меньше совместимость с более старыми реализациями .NET. 🚩Пример использования Создаём Class Library с таргетом .NET Standard 2.0:
   namespace MyLibrary
   {
       public class MathHelper
       {
           public static int Add(int a, int b)
           {
               return a + b;
           }
       }
   }
Ставь 👍 и забирай 📚 Базу знаний

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

🤔 Что такое value-type? Value Type (тип значения) – это тип данных, который хранит своё значение непосредственно в памяти (обычно в стеке), а не ссылку на объект в куче (heap), как это делает ссылочный тип (Reference Type). 🚩Какие типы данных являются Value Type? Простые типы (int, double, bool, char, byte, float, decimal, etc.) Структуры (struct) Перечисления (enum) Nullable-значения (int?, double?) 🚩Пример Value Type
int a = 10;
int b = a; // Значение копируется

b = 20;
Console.WriteLine(a); // 10 (остался неизменным)
Console.WriteLine(b); // 20
🚩Где хранятся Value Type? Value Type обычно хранятся в стеке (stack) – это быстрая область памяти. Если структура (struct) является частью объекта (который хранится в куче), то её значение хранится внутри объекта в куче.
struct Point
{
    public int X;
    public int Y;
}

class Program
{
    static void Main()
    {
        Point p1 = new Point { X = 5, Y = 10 };
        Point p2 = p1; // Копирование структуры (создаётся новый экземпляр)

        p2.X = 20;
        Console.WriteLine(p1.X); // 5 (остался неизменным)
        Console.WriteLine(p2.X); // 20
    }
}
🚩Когда использовать Value Type? Если данные небольшие и часто изменяются – struct Если объект недолговечный и не требует сложного поведения Если производительность важна – Value Type быстрее из-за работы в стеке Ставь 👍 и забирай 📚 Базу знаний

🤔 Какие типы шаблонов проектирования есть? C# поддерживает все классические шаблоны проектирования (по GoF), включая: - Порождающие: Singleton, Factory Method, Abstract Factory, Builder, Prototype. - Структурные: Adapter, Bridge, Composite, Decorator, Facade, Flyweight, Proxy. - Поведенческие: Strategy, Observer, Command, State, Visitor, Mediator, Chain of Responsibility, Memento, Interpreter, Iterator, Template Method. А также часто используются: - Dependency Injection - Repository - Unit of Work - MVVM (в WPF) и MVC (в ASP.NET) Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Пожизненный PRO доступ на easyoffer — по цене одного года! До 31 марта вы можете купить PRO навсегда. Запускаем акцию, чтобы
Пожизненный PRO доступ на easyoffer — по цене одного года! До 31 марта вы можете купить PRO навсегда. Запускаем акцию, чтобы ускорить развитие сервиса. Что добавим в PRO в ближайшие полгода: – Автоотклики – Агрегатор вакансий – Проход ATS без отсева – Уникальные резюме и письма под каждую вакансию Покупаешь один раз — пользуешься всю жизнь. 👉 Купить PRO со скидкой 70%: https://easyoffer.ru/pro

🤔 Какие объекты живут в нулевом поколении? В C# и .NET память управляется сборщиком мусора (Garbage Collector, GC), который делит объекты на три поколения 🟠Generation 0 (Gen 0, нулевое поколение) самые "молодые" объекты. 🟠Generation 1 (Gen 1, первое поколение) промежуточные объекты. 🟠Generation 2 (Gen 2, второе поколение) "долгоживущие" объекты. 🚩Какие объекты попадают в Generation 0? В Gen 0 живут "короткоживущие" объекты которые создаются и быстро уничтожаются. Это новые объекты, которые только что были выделены в управляемой куче (Heap). Обычно это локальные переменные внутри методов, если они не выходят за их пределы. Пример объектов в Gen 0
class Program
{
    static void Main()
    {
        for (int i = 0; i < 5; i++)
        {
            var obj = new object(); // Этот объект создаётся в Gen 0
        }

        GC.Collect(); // Принудительный запуск GC для проверки
    }
}
🚩Когда объекты остаются в Gen 0, а когда переходят в следующее поколение? Если объект быстро умирает → удаляется из Gen 0 при первой же очистке. Если объект выжил после первой очистки GC → переходит в Gen 1. Если объект живёт долго → может попасть в Gen 2. Ставь 👍 и забирай 📚 Базу знаний

🤔 Когда можно использовать using? using используется для управления объектами, реализующими интерфейс IDisposable, чтобы гарантировать освобождение ресурсов. Это удобно для работы с файлами, потоками, базами данных и другими ресурсами, требующими явного закрытия. Код внутри блока using автоматически вызывает метод Dispose для объекта, даже если возникло исключение. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Какие есть модификаторы доступа? Есть модификаторы доступа, которые определяют, кто может использовать классы, методы и переменные. Они помогают скрыть внутренние детали кода и контролировать доступ к данным. 🚩Подробное объяснение с примерами 🟠`public` (Открытый доступ) Открытый доступ означает, что элемент можно использовать везде.
public class Car
{
    public string Model = "Tesla";
}

class Program
{
    static void Main()
    {
        Car car = new Car();
        Console.WriteLine(car.Model); // Доступ открыт
    }
}
🟠`private` (Только внутри класса) Самый закрытый модификатор. Поля и методы невидимы за пределами класса.
class Car
{
    private string model = "Tesla";

    private void PrintModel()
    {
        Console.WriteLine(model);
    }
}

class Program
{
    static void Main()
    {
        Car car = new Car();
        // car.model = "BMW";   Ошибка! Поле `model` — private
        // car.PrintModel();  Ошибка! Метод `PrintModel` — private
    }
}
🟠`protected` (Доступен в наследниках) Доступен только внутри класса и его наследников.
class Car
{
    protected string Model = "Tesla";
}

class ElectricCar : Car
{
    public void ShowModel()
    {
        Console.WriteLine(Model); //  Можно, потому что наследуемый класс
    }
}

class Program
{
    static void Main()
    {
        ElectricCar eCar = new ElectricCar();
        // eCar.Model  Ошибка! Поле `Model` доступно только в наследниках
    }
}
🟠`internal` (Только внутри проекта) Элементы с internal можно использовать только внутри одной сборки (проекта).
internal class Engine
{
    public void Start() => Console.WriteLine("Двигатель запущен");
}

class Program
{
    static void Main()
    {
        Engine engine = new Engine();
        engine.Start(); //  Работает, потому что внутри того же проекта
    }
}
🟠`protected internal` (В сборке и у наследников) Этот модификатор разрешает доступ внутри сборки, а также в классах-наследниках за её пределами.
public class Car
{
    protected internal string Model = "Tesla";
}

class ElectricCar : Car
{
    public void ShowModel()
    {
        Console.WriteLine(Model); //  Можно, потому что наследник
    }
}
🟠`private protected` (Только в классе и наследниках из той же сборки) Этот модификатор ещё жёстче, чем protected internal: - Доступ внутри класса – да - В наследниках – только внутри той же сборки - В других проектах – нет доступа!
class Car
{
    private protected string Model = "Tesla";
}

class ElectricCar : Car
{
    public void ShowModel()
    {
        Console.WriteLine(Model); //  Можно, потому что наследник в той же сборке
    }
}

class Program
{
    static void Main()
    {
        ElectricCar eCar = new ElectricCar();
        // eCar.Model  Ошибка! `Model` доступен только в наследниках из этой сборки
    }
}
Ставь 👍 и забирай 📚 Базу знаний

Скидки до 90% на Wildberries На WB собрали удобную и стильную обувь для всей семьи 🏃‍♂️ Модные кроссовки, удобные сабо, клас
Скидки до 90% на Wildberries На WB собрали удобную и стильную обувь для всей семьи 🏃‍♂️ Модные кроссовки, удобные сабо, классические туфли и другие популярные модели от известных брендов. Кстати, сейчас на Wildberries действуют скидки до 90% и быстрая доставка от 1 дня. Отличный шанс пополнить свою коллекцию обуви ❤️ Перейти на сайт #реклама wildberries.ru О рекламодателе