uk
Feedback

Не попадись на ботовода! Telemetrio знаходить і позначає такі канали мітками 👉 Хочеш бачити мітку, оформляй підписку

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

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

Відкрити в Telegram

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

Показати більше
5 005
Підписники
+124 години
-97 днів
+530 днів
Архів дописів
🤔 Расскажи про принцип подстановки Барбары Лисков? Принцип подстановки Барбары Лисков (Liskov Substitution Principle, LSP) является одним из пяти принципов объектно-ориентированного программирования, известных под акронимом SOLID. 🚩Основная идея LSP Основная идея заключается в том, что если класс B является подтипом класса A, то объекты класса A могут быть заменены объектами класса B без изменения правильности работы программы. Это означает, что наследование должно использоваться так, чтобы производный класс сохранял поведение базового класса. 🚩Правила для соблюдения LSP 🟠Сохранение контрактов: Производный класс должен соблюдать контракт, определённый базовым классом. Это включает в себя сигнатуры методов и ожидания (предусловия и постусловия). 🟠Инварианты класса: Инварианты, или неизменяемые условия, которые выполняются для объектов базового класса, должны оставаться в силе и для объектов производного класса. 🟠Постусловия не должны быть ослаблены: Производный класс не должен ослаблять постусловия методов базового класса. Постусловия - это условия, которые гарантированы после выполнения метода. 🟠Предусловия не должны быть усилены: Производный класс не должен усиливать предусловия методов базового класса. Предусловия - это условия, которые должны быть выполнены перед вызовом метода. В этом примере Penguin нарушает LSP, так как он не может летать. Если заменить экземпляр FlyingBird на Penguin, программа перестанет работать правильно.
public abstract class Bird
{
    public abstract void Fly();
}

public class FlyingBird : Bird
{
    public override void Fly()
    {
        Console.WriteLine("I can fly!");
    }
}

public class Penguin : Bird
{
    public override void Fly()
    {
        throw new NotSupportedException("Penguins cannot fly.");
    }
}
Теперь классы FlyingBird и Penguin оба наследуют класс Bird и реализуют метод Move, но каждый делает это по-своему, не нарушая LSP.
public abstract class Bird
{
    public abstract void Move();
}

public class FlyingBird : Bird
{
    public override void Move()
    {
        Fly();
    }

    private void Fly()
    {
        Console.WriteLine("I can fly!");
    }
}

public class Penguin : Bird
{
    public override void Move()
    {
        Console.WriteLine("I waddle.");
    }
}
🚩Плюсы ➕Повышенная гибкость и расширяемость: Код, который соблюдает LSP, легче модифицировать и расширять без риска нарушения существующей функциональности. ➕Упрощённое тестирование: Код, соответствующий LSP, легче тестировать, так как можно заменять объекты их подтипами в тестах без изменения поведения. ➕Повышенная поддерживаемость: Такой код легче поддерживать и рефакторить, так как контракт между базовым и производным классами чётко определён и соблюдается. Ставь 👍 и забирай 📚 Базу знаний

Если ты Junior .NET разработчик и хочешь выйти на новый уровень 📈 — время прокачать навыки с Level Up! Приглашаем на бесплат
Если ты Junior .NET разработчик и хочешь выйти на новый уровень 📈 — время прокачать навыки с Level Up! Приглашаем на бесплатный live coding практикум «Разработка системы учёта проездных билетов за 60 минут» с преподавателем курса 18 октября в 19:00 МСК. 💡 Что узнаете: Инструменты разработки на .NET. Как создать веб-приложение на C# и интегрировать его с базой Postgres. 📅 Заявка на практикум

🤔 Что такое делегат? Делегат в C# — это тип, который представляет ссылки на методы с определённой сигнатурой. Делегаты используются для передачи методов в качестве параметров и для обратных вызовов (callbacks). Они являются основой для событий и лямбда-выражений в C#. Делегаты позволяют вызывать методы динамически, что делает код более гибким. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое полиморфизм подтипов? Полиморфизм подтипов — это способность объектов разных классов, связанных отношениями наследования, обрабатываться единообразно. Это позволяет использовать объекты подклассов через ссылки на базовые классы, что делает код гибким и расширяемым. 🚩Основные понятия 🟠Наследование: Классы могут наследовать другие классы, унаследуя их методы и свойства. 🟠Интерфейсы: Классы могут реализовывать интерфейсы, обеспечивая конкретную реализацию методов интерфейса. 🟠Виртуальные методы: Методы, объявленные как virtual в базовом классе, могут быть переопределены в производных классах с использованием ключевого слова override. 🟠Позднее связывание: Метод, который будет вызван, определяется во время выполнения, а не во время компиляции. Базовый класс и производные классы
public class Animal
{
    // Виртуальный метод, который может быть переопределен в производных классах
    public virtual void Speak()
    {
        Console.WriteLine("Animal speaks");
    }
}

public class Dog : Animal
{
    // Переопределение метода Speak для класса Dog
    public override void Speak()
    {
        Console.WriteLine("Dog barks");
    }
}

public class Cat : Animal
{
    // Переопределение метода Speak для класса Cat
    public override void Speak()
    {
        Console.WriteLine("Cat meows");
    }
}
Использование полиморфизма подтипов
class Program
{
    static void Main()
    {
        // Создание массива объектов типа Animal
        Animal[] animals = new Animal[]
        {
            new Dog(),
            new Cat(),
            new Animal()
        };

        // Вызов метода Speak для каждого объекта в массиве
        foreach (Animal animal in animals)
        {
            animal.Speak();
        }
    }
}
🟠Полиморфизм с интерфейсами Полиморфизм также может быть достигнут через интерфейсы. В этом примере классы Dog и Cat реализуют интерфейс IAnimal, и метод Speak вызывается через интерфейс, что также демонстрирует полиморфизм подтипов.
public interface IAnimal
{
    void Speak();
}

public class Dog : IAnimal
{
    public void Speak()
    {
        Console.WriteLine("Dog barks");
    }
}

public class Cat : IAnimal
{
    public void Speak()
    {
        Console.WriteLine("Cat meows");
    }
}

class Program
{
    static void Main()
    {
        IAnimal[] animals = new IAnimal[]
        {
            new Dog(),
            new Cat()
        };

        foreach (IAnimal animal in animals)
        {
            animal.Speak();
        }
    }
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое принципы SOLID? SOLID — это набор пяти принципов объектно-ориентированного программирования, которые помогают писать гибкий и поддерживаемый код. Принципы включают: Single Responsibility (одна ответственность), Open/Closed (открытость для расширения, закрытость для изменений), Liskov Substitution (подстановка Барбары Лисков), Interface Segregation (разделение интерфейсов) и Dependency Inversion (инверсия зависимостей). Эти принципы помогают избежать излишней сложности и улучшить структуру программного кода. Применение SOLID делает код более устойчивым к изменениям и легче в сопровождении. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое статический полиморфизм? Статический полиморфизм, также известный как полиморфизм на этапе компиляции, — это форма полиморфизма, при которой вызов метода или доступ к члену определяется во время компиляции, а не во время выполнения. Статический полиморфизм достигается с помощью таких механизмов, как перегрузка методов (method overloading) и обобщенные типы (generics). 🚩Перегрузка методов (Method Overloading) Перегрузка методов позволяет иметь несколько методов с одинаковым именем, но разными параметрами (различные типы, количество или порядок параметров). Компилятор решает, какой метод вызвать, основываясь на переданных аргументах.
public class MathOperations
{
    public int Add(int a, int b)
    {
        return a + b;
    }

    public double Add(double a, double b)
    {
        return a + b;
    }

    public int Add(int a, int b, int c)
    {
        return a + b + c;
    }
}

class Program
{
    static void Main()
    {
        MathOperations math = new MathOperations();
        
        int result1 = math.Add(2, 3);         // Вызовется метод Add(int, int)
        double result2 = math.Add(2.5, 3.5);  // Вызовется метод Add(double, double)
        int result3 = math.Add(1, 2, 3);      // Вызовется метод Add(int, int, int)
        
        Console.WriteLine(result1);  // Вывод: 5
        Console.WriteLine(result2);  // Вывод: 6.0
        Console.WriteLine(result3);  // Вывод: 6
    }
}
🚩Обобщенные типы (Generics) Обобщенные типы позволяют создавать классы, методы и структуры, работающие с любыми типами данных, обеспечивая безопасность типов на этапе компиляции и избегая затрат на приведение типов.
public class GenericCalculator<T>
{
    public T Add(T a, T b)
    {
        dynamic da = a;
        dynamic db = b;
        return da + db;
    }
}

class Program
{
    static void Main()
    {
        GenericCalculator<int> intCalculator = new GenericCalculator<int>();
        int intResult = intCalculator.Add(3, 4); // Вызов метода для типа int
        Console.WriteLine(intResult); // Вывод: 7

        GenericCalculator<double> doubleCalculator = new GenericCalculator<double>();
        double doubleResult = doubleCalculator.Add(2.5, 3.7); // Вызов метода для типа double
        Console.WriteLine(doubleResult); // Вывод: 6.2
    }
}
🚩Отличия от динамического полиморфизма 🟠Статический полиморфизм определяется на этапе компиляции, в то время как динамический полиморфизм (также известный как позднее связывание или полиморфизм на этапе выполнения) определяется во время выполнения с помощью виртуальных методов и наследования. В этом примере компилятор не знает заранее, какой метод Speak будет вызван, так как это определяется во время выполнения.
public class Animal
{
    public virtual void Speak()
    {
        Console.WriteLine("Animal speaks");
    }
}

public class Dog : Animal
{
    public override void Speak()
    {
        Console.WriteLine("Dog barks");
    }
}

class Program
{
    static void Main()
    {
        Animal myAnimal = new Dog();
        myAnimal.Speak(); // Вывод: Dog barks
    }
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое Inversion of control и dependency injection? Inversion of control (IoC) — это принцип, при котором управление созданием объектов передается внешним компонентам. Dependency injection (DI) — это один из способов реализации IoC, когда зависимости передаются объекту через конструктор, методы или свойства. Это позволяет улучшить тестируемость и модульность кода. DI делает систему более гибкой, позволяя изменять реализации зависимостей без изменения кода. Ставь 👍 и забирай 📚 Базу знаний

Обучаем Java-разработчиков оплата после выхода на работу В Kata Academy можно выучиться на Java-разработчика бесплатно, а зап
Обучаем Java-разработчиков оплата после выхода на работу В Kata Academy можно выучиться на Java-разработчика бесплатно, а заплатить уже после трудоустройства по специальности из фактической зарплаты. Если задуматься, то все в выигрыше: — ты получаешь работу в Москве или Санкт-Петербурге с хорошей зарплатой, мы получаем процент за инвестиции в тебя; — в наших интересах научить тебя так, чтобы твоя зарплата была как можно выше; — мы прокачиваем твои навыки еще 2 года после курса: проводим выездные мероприятия и мастер-классы — и доходы наших выпускников растут; — мы не зависим от банков и их рассрочек — кризис не повлиял на доступность курсов. Чтобы попасть на курс, нужно выполнить небольшое тестовое задание. Переходи по ссылке и оставляй заявку! Узнать больше #реклама 16+ kata.academy О рекламодателе

🤔 Как работает static конструктор? Статический конструктор в предназначен для инициализации статических членов класса или для выполнения действий, которые должны быть выполнены один раз для всего класса, а не для каждого его экземпляра. 🚩Основные характеристики 🟠Автоматический вызов: Статический конструктор вызывается автоматически перед первым использованием любого статического члена класса или перед созданием первого экземпляра класса, в зависимости от того, что произойдет раньше. 🟠Единовременное выполнение: Статический конструктор выполняется только один раз на весь период существования приложения. 🟠Без параметров: Статический конструктор не может принимать параметры. 🟠Невозможность явного вызова: Невозможно вызвать статический конструктор вручную. Он вызывается автоматически. Рассмотрим класс, который использует статический конструктор для инициализации статического поля:
public class ConfigurationManager
{
    public static string Configuration;

    // Статический конструктор
    static ConfigurationManager()
    {
        Configuration = "Default Configuration";
        Console.WriteLine("Статический конструктор выполнен.");
    }
}

class Program
{
    static void Main()
    {
        // Обращение к статическому полю вызывает статический конструктор
        Console.WriteLine(ConfigurationManager.Configuration);
        
        // Создание экземпляра класса не вызовет статический конструктор снова
        ConfigurationManager configManager = new ConfigurationManager();
        Console.WriteLine(ConfigurationManager.Configuration);
    }
}
1⃣Первое обращение к статическому члену: Когда программа впервые обращается к ConfigurationManager.Configuration, вызывается статический конструктор класса ConfigurationManager. 2⃣Инициализация: Внутри статического конструктора происходит инициализация статического поля Configuration. 3⃣Вывод: В консоли будет выведено сообщение "Статический конструктор выполнен." и значение "Default Configuration". Ставь 👍 и забирай 📚 Базу знаний

🤔 В чём разница абстрактного класса и интерфейса? Абстрактный класс может содержать как реализацию методов, так и абстрактные методы, а интерфейс — только определения методов без реализации. Абстрактные классы могут иметь поля и конструкторы, а интерфейсы — нет. Класс может наследовать только один абстрактный класс, но реализовать несколько интерфейсов. Интерфейсы предоставляют более гибкий способ организации контракта для классов. Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое static? Static - это ключевое слово, которое используется для объявления статических членов в классе. Статические члены принадлежат самому классу, а не его экземплярам. 🚩Основные моменты использования 🟠Поля Статические поля объявляются с использованием ключевого слова static и принадлежат классу в целом. Все экземпляры класса разделяют одно и то же статическое поле.
public class Example
{
     public static int Counter;
}

// Доступ к статическому полю
Example.Counter = 10;
Console.WriteLine(Example.Counter); // Выведет 10
🟠Методы Статические методы могут быть вызваны без создания экземпляра класса. Статические методы могут обращаться только к другим статическим членам класса.
public class Calculator
{
    public static int Add(int a, int b)
    {
        return a + b;
    }
}

// Вызов статического метода
int sum = Calculator.Add(5, 3);
Console.WriteLine(sum); // Выведет 8
🟠Свойства Статические свойства похожи на статические поля, но с доступом через методы get и set.
public class Configuration
{
    private static string _setting;

    public static string Setting
    {
        get { return _setting; }
        set { _setting = value; }
    }
}

// Доступ к статическому свойству
Configuration.Setting = "My Setting";
Console.WriteLine(Configuration.Setting); // Выведет "My Setting"
🟠Конструкторы Статические конструкторы используются для инициализации статических членов класса. Они вызываются один раз при первом обращении к статическим членам.
public class Database
{
    public static string ConnectionString;

    static Database()
    {
        ConnectionString = "Initial Catalog=myDatabase;Data Source=myServer;";
    }
}

// При первом доступе вызывается статический конструктор
Console.WriteLine(Database.ConnectionString); // Выведет строку подключения
🚩Зачем нужен? 🟠Общие данные и функции: Статические члены полезны для хранения данных или функций, которые должны быть общими для всех экземпляров класса. 🟠Упрощение доступа: Позволяет вызывать методы и свойства без необходимости создавать экземпляр класса. 🟠Инициализация ресурсов: Статические конструкторы полезны для инициализации ресурсов или настройки параметров, необходимых для работы класса. 🚩Ограничения 🟠Статические методы не могут обращаться к нестатическим членам напрямую, так как у них нет доступа к экземпляру класса. 🟠Статические конструкторы не могут иметь параметры и вызываются автоматически при первом обращении к классу. Ставь 👍 и забирай 📚 Базу знаний

Прошел тест ASP NET - навыки прокачал, зарплату поднял! 😎 8 бонусов для справившихся - уроки по «горячим» темам, список лите
Прошел тест ASP NET - навыки прокачал, зарплату поднял! 😎 8 бонусов для справившихся  - уроки по «горячим» темам, список литературы, карта развития навыков специалиста.  Ну и приличная скидка на курс по C# ASP.NET Core разработчик ждет тебя, смельчак! ✅ Испытание для избранных начинается тут: https://otus.pw/j7A4/?erid=LjN8KSWMh Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.

🤔 Что делает GetAwaiter?
Anonymous voting

Помощь в трудоустройстве в IT-сфере! По всей России объявили бесплатную программу на шестимесячное обучение по IT-cпециальнос
+9
Помощь в трудоустройстве в IT-сфере! По всей России объявили бесплатную программу на шестимесячное обучение по IT-cпециальностям. Запись на участие в программе продлится до конца июля, но чтобы туда попасть, нужно пройти специальный профтест. По результату тестирования сразу узнаете, какая профессия вам подойдет, и проходите ли вы на бесплатное обучение. Перейти на сайт #реклама 16+ urban-university.ru О рекламодателе

🤔 Как проводить тестирование и отладку? Тестирование программного обеспечения включает планирование тестов, их выполнение для проверки функциональности и других аспектов, а отладка занимается устранением найденных в ходе тестирования ошибок через анализ кода и логов. 🟠Использование отладчика (Debugger) Visual Studio предоставляет мощные инструменты отладки. Основные возможности включают установку точек останова (breakpoints), пошаговое выполнение кода (step over, step into, step out), просмотр значений переменных и выражений. 1⃣Установка точки останова: Нажмите слева от строки кода, где нужно остановиться, или используйте клавишу F9. 2⃣Запуск отладки: Нажмите F5 или выберите "Debug -> Start Debugging". 3⃣Пошаговое выполнение: Используйте F10 (step over), F11 (step into) и Shift+F11 (step out). 🟠Использование `Debug` и `Trace` Для вывода отладочной информации можно использовать классы Debug и Trace из пространства имен System.Diagnostics.
using System.Diagnostics;

public class Program
{
    public static void Main()
    {
        Debug.WriteLine("This is a debug message.");
        Trace.WriteLine("This is a trace message.");
    }
}
🟠Журналирование (Logging) Использование журналирования позволяет записывать события и ошибки во время выполнения приложения. В .NET Core и ASP.NET Core используется встроенная система логирования.
public class HomeController : Controller
{
    private readonly ILogger<HomeController> _logger;

    public HomeController(ILogger<HomeController> logger)
    {
        _logger = logger;
    }

    public IActionResult Index()
    {
        _logger.LogInformation("Executing Index method");
        return View();
    }
}
🟠Анализ дампов памяти В случае критических ошибок можно анализировать дампы памяти для диагностики проблем. Используйте WinDbg или Visual Studio для анализа дампов. Ставь 👍 и забирай 📚 Базу знаний

⚡️ IT-обучение теперь в Telegram! В cвязи с недавнем замедлением Ютуба — лучшие обучающие каналы переехали в Telegram Вот кан
⚡️ IT-обучение теперь в Telegram! В cвязи с недавнем замедлением Ютуба — лучшие обучающие каналы переехали в Telegram Вот каналы для айтишников: 👩‍💻 C#: @Csharp 👩‍💻 С/С++: @Cpp 👩‍💻 Разработка игр: @GameDev 📱 GitHub: @GitHub ⚙️ Backend: @Backend 🤓 Общее айти: @portalToIT 👩‍💻 Python: @Python 👩‍💻 Frontend: @Frontend 👩‍💻 Java: @Java 🖥 Базы Данных & SQL: @SQL 👩‍💻 Golang: @Golang 👩‍💻 PHP: @PHP 👩‍💻 Моб. разработка: @MobDev 👩‍💻 DevOps: @DevOps 🖥 Data Science: @DataScience 🤔 Хакинг & ИБ: @InfoSec 🐞 Тестирование: @QA 📱 Маркетинг: @Marketing 🖥 Дизайн: @Design ➡️ Сохраняйте себе, чтобы не потерять

🤔 Что такое yield в C#?
Anonymous voting

🤔 Как работаешь с асинхронными операциями? Работа с асинхронными операциями в C# важна для создания производительных и отзывчивых приложений, особенно когда дело касается операций ввода-вывода, сетевых запросов или длительных вычислений. В C# для этого используется ключевые слова async и await, а также Task и Task<T>. 🚩Основные Концепции 🟠Ключевые слова `async` и `await` `async`: Указывает, что метод является асинхронным и может содержать операторы await. `await`: Используется для ожидания завершения асинхронной операции без блокировки основного потока. 🟠Task и Task<T> `Task`: Представляет асинхронную операцию без возвращаемого значения. `Task<T>`: Представляет асинхронную операцию, возвращающую значение типа T. 🚩Пример Асинхронного Метода 🟠Рассмотрим пример простого асинхронного метода, который выполняет задержку на 2 секунды.
public async Task DelayExampleAsync()
{
    Console.WriteLine("Начало задержки");
    await Task.Delay(2000); // Асинхронная задержка на 2 секунды
    Console.WriteLine("Завершение задержки");
}
🟠Асинхронный Ввод-Вывод Асинхронные операции ввода-вывода часто используются для работы с файлами, сетевыми запросами и базами данных. Пример асинхронного чтения файла:
public async Task<string> ReadFileAsync(string filePath)
{
    using (StreamReader reader = new StreamReader(filePath))
    {
        return await reader.ReadToEndAsync();
    }
}
🟠Асинхронные HTTP-запросы Для выполнения асинхронных HTTP-запросов можно использовать HttpClient.
public async Task<string> FetchDataFromApiAsync(string url)
{
    using (HttpClient client = new HttpClient())
    {
        HttpResponseMessage response = await client.GetAsync(url);
        response.EnsureSuccessStatusCode();
        return await response.Content.ReadAsStringAsync();
    }
}
🟠Обработка Исключений в Асинхронных Методах Обработка исключений в асинхронных методах аналогична синхронным методам, с использованием блоков try-catch.
public async Task<string> SafeFetchDataFromApiAsync(string url)
{
    try
    {
        using (HttpClient client = new HttpClient())
        {
            HttpResponseMessage response = await client.GetAsync(url);
            response.EnsureSuccessStatusCode();
            return await response.Content.ReadAsStringAsync();
        }
    }
    catch (HttpRequestException ex)
    {
        Console.WriteLine($"Ошибка запроса: {ex.Message}");
        return string.Empty;
    }
}
🟠Совместное Выполнение Асинхронных Операций Для выполнения нескольких асинхронных операций параллельно можно использовать Task.WhenAll или Task.WhenAny.
public async Task PerformMultipleTasksAsync()
{
    Task<int> task1 = Task.Run(() => ComputeAsync(10));
    Task<int> task2 = Task.Run(() => ComputeAsync(20));

    int[] results = await Task.WhenAll(task1, task2);
    Console.WriteLine($"Результаты: {results[0]}, {results[1]}");
}

public async Task<int> ComputeAsync(int value)
{
    await Task.Delay(1000);
    return value * value;
}
🟠Пример Полного Асинхронного Приложения Рассмотрим пример асинхронного метода, который загружает данные из нескольких URL и выводит их размер.
public async Task FetchDataFromMultipleUrlsAsync(string[] urls)
{
    List<Task<string>> fetchTasks = new List<Task<string>>();

    foreach (string url in urls)
    {
        fetchTasks.Add(FetchDataFromApiAsync(url));
    }

    string[] results = await Task.WhenAll(fetchTasks);

    foreach (string result in results)
    {
        Console.WriteLine($"Длина данных: {result.Length}");
    }
}
Ставь 👍 и забирай 📚 Базу знаний

Senior-разработчик создал крутейший канал про SQL Благодаря простым картинкам даже новичок научится разрабатывать приложения
+4
Senior-разработчик создал крутейший канал про SQL Благодаря простым картинкам даже новичок научится разрабатывать приложения с использованием баз данных. Присоединяйтесь: @SQL

🤔 Какой метод используется для сериализации объекта в C#?
Anonymous voting