ru
Feedback

Не попадитесь на канал ботавода! Telemetrio находит и помечает такие каналы 👉 Хотите видеть метку — оформите подписку

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

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

Открыть в Telegram
5 007
Подписчики
-324 часа
-87 дней
+430 дней
Архив постов
🤔 Что из себя представляет абстракция? Это один из ключевых принципов объектно-ориентированного программирования (ООП), который позволяет выделять важные характеристики объекта, игнорируя несущественные детали. Абстракция упрощает сложные системы, предоставляя только те аспекты, которые необходимы для выполнения конкретной задачи. 🚩Аспекты 🟠Скрытие деталей реализации Абстракция позволяет скрыть сложные детали реализации и предоставлять простой интерфейс для взаимодействия с объектом.
public abstract class Animal
{
    public abstract void MakeSound();
}

public class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Bark");
    }
}
🟠Определение интерфейсов и абстрактных классов Интерфейсы и абстрактные классы являются основными инструментами абстракции в C#. Интерфейсы определяют контракт, который должен быть реализован классами, а абстрактные классы могут содержать как реализацию, так и абстрактные методы.
public interface IShape
{
   double GetArea();
}

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

public abstract class Vehicle
{
   public abstract void Move();
}

public class Car : Vehicle
{
    public override void Move()
    {
       Console.WriteLine("Car is moving");
    }
}   
🚩Сокрытие ненужных деталей Абстракция помогает пользователям взаимодействовать с объектом через его публичный интерфейс, не беспокоясь о внутренних деталях.
public class CoffeeMachine
{
    public void MakeCoffee()
    {
        HeatWater();
        BrewCoffee();
        PourCoffee();
    }

    private void HeatWater() { /* Подогрев воды */ }
    private void BrewCoffee() { /* Заваривание кофе */ }
    private void PourCoffee() { /* Наливание кофе */ }
}   
Ставь 👍 и забирай 📚 Базу знаний

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

Начните зарабатывать с искусственным интеллектом с нуля! 💻 Не знаешь, с чего начать? Мы научим, как зарабатывать с помощью И
Начните зарабатывать с искусственным интеллектом с нуля! 💻 Не знаешь, с чего начать? Мы научим, как зарабатывать с помощью ИИ. ✨ Без опыта? Не проблема! Ты научишься создавать с ИИ тексты, статьи, креативы, озвучку, презентации, сайты и многое другое — и начнешь зарабатывать уже на первом заказе. С нами ты всегда будешь в плюсе! ⚡ Наши менеджеры помогут найти задания за 10% от их стоимости, чтобы ты начал зарабатывать уже сегодня. Мы с тобой на каждом этапе пути! ✅ Присоединяйся к нашему телеграм-каналу и меняй свою жизнь прямо сейчас! Подписаться #реклама О рекламодателе

🤔 Что такое тесные связи между объектами? Это ситуация, когда один объект сильно зависит от другого, что затрудняет их независимое изменение и тестирование. Например, если изменение в одном объекте требует изменений в другом объекте, то связь между ними считается тесной.
public class DataService
{
    public void SaveData(string data) { /* Сохранение данных */ }
}

public class Processor
{
    private DataService _dataService = new DataService();

    public void Process(string data)
    {
        _dataService.SaveData(data);
    }
}
Уменьшенная связность
public interface IDataService
{
    void SaveData(string data);
}

public class DataService : IDataService
{
    public void SaveData(string data) { /* Сохранение данных */ }
}

public class Processor
{
    private readonly IDataService _dataService;

    public Processor(IDataService dataService)
    {
        _dataService = dataService;
    }

    public void Process(string data)
    {
        _dataService.SaveData(data);
    }
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое инкапсуляция? Инкапсуляция скрывает детали реализации объекта, предоставляя доступ через публичные методы для защиты данных. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое связанность и связность? 🚩Связанность (Cohesion) Описывает, насколько элементы внутри модуля связаны между собой. Высокая связанность (хорошая) означает, что элементы модуля работают над одной задачей.
public class FileProcessor
{
    public void ProcessFile(string filePath)
    {
        ReadFile(filePath);
        ParseData();
        SaveResults();
    }

    private void ReadFile(string filePath) { /* чтение файла */ }
    private void ParseData() { /* парсинг данных */ }
    private void SaveResults() { /* сохранение результатов */ }
}
🚩Связность (Coupling) Описывает зависимость между модулями. Низкая связность (хорошая) означает, что модули минимально зависят друг от друга.
public interface IDataService
{
    void SaveData(string data);
}

public class DataService : IDataService
{
    public void SaveData(string data) { /* сохранение данных */ }
}

public class Processor
{
    private readonly IDataService _dataService;

    public Processor(IDataService dataService)
    {
        _dataService = dataService;
    }

    public void Process(string data)
    {
        _dataService.SaveData(data);
    }
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Как работает Entity Framework? EF преобразует данные из базы в объекты .NET, поддерживает LINQ-запросы и управление миграциями. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Для чего используется dependency injection? Dependency Injection (DI) используется для управления зависимостями объектов в приложении. Это шаблон проектирования, который помогает реализовать принцип инверсии зависимостей (DIP) из SOLID-принципов. DI делает код более модульным, тестируемым и гибким. Рассмотрим ключевые цели и преимущества использования Dependency Injection. 🚩Основные цели 🟠Снижение связанности кода DI позволяет классу получить свои зависимости извне, вместо того чтобы создавать их самостоятельно. Это снижает связанность кода и упрощает его сопровождение и изменение.
public class UserService
{
private readonly IUserRepository _userRepository;

// Зависимость внедряется через конструктор
public UserService(IUserRepository userRepository)
{
_userRepository = userRepository;
}

public void CreateUser(string name)
{
_userRepository.AddUser(name);
}
}
🟠Улучшение тестируемости DI упрощает создание юнит-тестов, так как зависимости могут быть заменены моками или стабыми. Это позволяет изолировать тестируемый код и тестировать его независимо от реальных зависимостей.
[Test]
public void CreateUser_ShouldCallAddUser()
{
var mockRepository = new Mock<IUserRepository>();
var userService = new UserService(mockRepository.Object);

userService.CreateUser("John Doe");

mockRepository.Verify(r => r.AddUser("John Doe"), Times.Once);
}
🟠Повышение гибкости и расширяемости DI позволяет легко заменять реализации зависимостей, что упрощает изменение поведения приложения без необходимости модификации кода, использующего эти зависимости.
var services = new ServiceCollection();
services.AddTransient<IUserRepository, UserRepository>();
services.AddTransient<UserService>();

var serviceProvider = services.BuildServiceProvider();
var userService = serviceProvider.GetService<UserService>();   
🟠Управление жизненным циклом объектов DI-контейнеры позволяют управлять жизненным циклом зависимостей, обеспечивая контроль над созданием, временем жизни и удалением объектов.
services.AddSingleton<IConfiguration>(new Configuration());
services.AddScoped<IDatabaseContext, DatabaseContext>();
services.AddTransient<IUserRepository, UserRepository>();   
🚩Пример использования Dependency Injection Определение интерфейсов и реализаций
public interface IMessageService
{
    void SendMessage(string message);
}

public class EmailService : IMessageService
{
    public void SendMessage(string message)
    {
        Console.WriteLine($"Email sent: {message}");
    }
}

public class SmsService : IMessageService
{
    public void SendMessage(string message)
    {
        Console.WriteLine($"SMS sent: {message}");
    }
}
Внедрение зависимостей через конструктор
public class NotificationController
{
    private readonly IMessageService _messageService;

    public NotificationController(IMessageService messageService)
    {
        _messageService = messageService;
    }

    public void Notify(string message)
    {
        _messageService.SendMessage(message);
    }
}
Настройка DI-контейнера
var services = new ServiceCollection();
services.AddTransient<IMessageService, EmailService>(); // или SmsService
services.AddTransient<NotificationController>();

var serviceProvider = services.BuildServiceProvider();
var controller = serviceProvider.GetService<NotificationController>();

controller.Notify("Hello World!");
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое ref & out? ref позволяет передавать переменные по ссылке, сохраняя изменения, а out требует инициализации переменной в методе. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Москвич 3 – надежно для вас и ваших увлечений Современный городской кроссовер Москвич 3. Ежемесячный платеж 17 500 рублей. По
Москвич 3 – надежно для вас и ваших увлечений Современный городской кроссовер Москвич 3. Ежемесячный платеж 17 500 рублей. Подробности уточняйте на официальном сайте moskvich.ru. Перейти на сайт Финансовые услуги оказывает: АО "Авто Финанс Банк", ПАО "Совкомбанк". #реклама moskvich.ru О рекламодателе

🤔 Использование интерфейса уже является dependency inversion? Использование интерфейсов в программировании может способствовать соблюдению принципа инверсии зависимостей (Dependency Inversion Principle, DIP), но само по себе использование интерфейсов не гарантирует полное соблюдение этого принципа. Давайте разберем подробнее, что такое принцип инверсии зависимостей и как интерфейсы помогают его соблюдать. 🚩Принцип инверсии зависимостей (DIP) Принцип инверсии зависимостей является одним из пяти принципов SOLID, которые определяют лучшие практики объектно-ориентированного проектирования и программирования. DIP гласит: Высокоуровневые модули не должны зависеть от низкоуровневых модулей. Оба должны зависеть от абстракций. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций. Это означает, что модули на более высоком уровне логики не должны зависеть от реализации конкретных классов на более низком уровне. Вместо этого они должны зависеть от абстракций, таких как интерфейсы или абстрактные классы. 🚩Как интерфейсы помогают соблюдать DIP Интерфейсы определяют контракт, который должен быть реализован классами. Высокоуровневые модули могут работать с интерфейсами, не зная конкретной реализации, что позволяет легко менять реализации без изменения высокоуровневого кода. Это способствует слабой связанности и улучшает тестируемость кода. Без соблюдения DIP
public class EmailService
{
    public void SendEmail(string to, string message)
    {
        // Логика отправки email
    }
}

public class NotificationService
{
    private EmailService _emailService;

    public NotificationService()
    {
        _emailService = new EmailService();
    }

    public void Notify(string to, string message)
    {
        _emailService.SendEmail(to, message);
    }
}
С соблюдением DIP
public interface INotificationService
{
    void Notify(string to, string message);
}

public class EmailService : INotificationService
{
    public void Notify(string to, string message)
    {
        // Логика отправки email
    }
}

public class SmsService : INotificationService
{
    public void Notify(string to, string message)
    {
        // Логика отправки SMS
    }
}

public class NotificationService
{
    private readonly INotificationService _notificationService;

    public NotificationService(INotificationService notificationService)
    {
        _notificationService = notificationService;
    }

    public void NotifyUser(string to, string message)
    {
        _notificationService.Notify(to, message);
    }
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Какие API можно назвать REST-овыми? REST API используют HTTP-методы, ресурсы представляются как URL, и архитектура основана на простоте и масштабируемости. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Классик-круиз по Нилу: путешествие между двух морей Идеально сбалансированный отдых найден: круиз по Нилу + экскурсии в Алекс
Классик-круиз по Нилу: путешествие между двух морей Идеально сбалансированный отдых найден: круиз по Нилу + экскурсии в Александрии и Каире + отдых на Красном море. В этом путешествии вы: — влюбитесь в камерную обстановку на борту уникального теплохода Amara (принимает на борт всего 56 гостей) — увидите множество достопримечательностей в круизе: Асуанскую плотину, храм богини Исиды на острове Филе, храм двух богов Ком-омбо и музей крокодилов, птолемеевский храм бога Гора, — познакомитесь с Каиром: увидите сверкающие сокровища Тутанхамона и другие уникальные экспонаты Египетского музея, пирамиды Гизы и Сфинкса — заглянете в легендарную Александрийскую библиотеку — расслабитесь на главном египетском городе-курорте с просторными пляжами и мягким песочком. Узнать больше #реклама 16+ infoflot.com О рекламодателе

🤔 Есть прямоугольник и квадрат, цель вычислить площадь, что нарушает принцип Барбары Лисков? Принцип подстановки Барбары Лисков (Liskov Substitution Principle, LSP) гласит, что объекты подклассов должны быть заменяемы объектами базового класса без нарушения ожидаемого поведения программы. Нарушение этого принципа часто проявляется в наследовании, где подклассы изменяют поведение, что может привести к неожиданным результатам. 🚩Пример с прямоугольником и квадратом Предположим, у нас есть базовый класс Rectangle и производный класс Square. Класс Rectangle имеет свойства Width и Height и метод для вычисления площади. Класс Square наследуется от Rectangle и устанавливает одинаковые значения для ширины и высоты.
public class Rectangle
{
    public virtual int Width { get; set; }
    public virtual int Height { get; set; }

    public int GetArea()
    {
        return Width * Height;
    }
}

public class Square : Rectangle
{
    public override int Width
    {
        set
        {
            base.Width = value;
            base.Height = value;
        }
    }

    public override int Height
    {
        set
        {
            base.Width = value;
            base.Height = value;
        }
    }
}
🚩Нарушение LSP Нарушение принципа Лисков проявляется в том, что Square изменяет поведение базового класса Rectangle. Рассмотрим пример использования этих классов:
public void ProcessRectangle(Rectangle rect)
{
    rect.Width = 10;
    rect.Height = 5;
    Console.WriteLine($"Expected Area: {10 * 5}");
    Console.WriteLine($"Actual Area: {rect.GetArea()}");
}
Если мы вызовем метод ProcessRectangle с экземпляром класса Rectangle, все будет работать корректно:
Rectangle rect = new Rectangle();
ProcessRectangle(rect); // Expected Area: 50, Actual Area: 50
Однако, если мы передадим экземпляр класса Square, поведение изменится:
Square square = new Square();
ProcessRectangle(square); // Expected Area: 50, Actual Area: 25
🚩Причина нарушения Класс Square изменяет поведение установки ширины и высоты так, что они всегда равны. Это нарушает ожидания, заложенные в базовый класс Rectangle, где ширина и высота могут быть установлены независимо друг от друга. 🚩Решение: Для соблюдения принципа Лисков лучше избегать наследования в таких случаях и использовать композицию или отдельные классы для прямоугольника и квадрата. Использование композиции
public abstract class Shape
{
    public abstract int GetArea();
}

public class Rectangle : Shape
{
    public int Width { get; set; }
    public int Height { get; set; }

    public override int GetArea()
    {
        return Width * Height;
    }
}

public class Square : Shape
{
    public int Side { get; set; }

    public override int GetArea()
    {
        return Side * Side;
    }
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Зачем нужны поколения для сборщика мусора в JS? Поколения разделяют объекты по возрасту, ускоряя сборку за счёт частой проверки короткоживущих объектов. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Проектирование геотехнических сооружений в России Закроем недостающие компетенции в области подземного проектирования. Опыт работы 12 лет. Выполнили более 180 объектов. Получить предложение #реклама geospt.ru О рекламодателе

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

🤔 Как работает в JS сборщик мусора? Сборщик мусора удаляет объекты, на которые нет ссылок, оптимизируя использование памяти. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Курс «Разработчик 1С» от Яндекса. За 6 месяцев освоите один из самых простых языков программирования и пройдёте стажировку За
Курс «Разработчик 1С» от Яндекса. За 6 месяцев освоите один из самых простых языков программирования и пройдёте стажировку Зарегистрироваться #реклама 16+ practicum.yandex.ru О рекламодателе

😎 База IT собеседований – твоё секретное оружие для успешного прохождения этапов отбора! Собеседования от реальных компаний: Сбер, Яндекс, ВТБ, Тинькофф, Озон, Wildberries и многие другие! 🏢 Мы собрали 230 собесов, чтобы ты мог подготовиться к интервью с уверенностью и успехом. 🎯 Присоединяйся к базе и прокачай свои шансы на успешное трудоустройство!