Перейти к содержимому
шпаргалка.
Esc
навигацияоткрыть⌘Jпредпросмотр
На этой странице

Базовые вопросы

Все темы С# Developer

Назовите основные принципы ООП

Основные принципы ООП:

  1. Инкапсуляция:

    • Сокрытие внутренней реализации объекта и предоставление интерфейса для взаимодействия с ним.
  2. Наследование:

    • Возможность создания нового класса на основе существующего, с заимствованием свойств и методов.
  3. Полиморфизм:

    • Способность объектов разного типа обрабатывать данные через единый интерфейс.
  4. Абстракция:

    • Выделение общих характеристик объектов и создание абстрактных классов и интерфейсов.

Как принципы ООП реализованы в C# и какие ограничения есть у наследования?

ООП-принципы с примерами:

  1. Инкапсуляция:

    • Сокрытие деталей реализации класса и предоставление доступа только к необходимым методам.

    • Пример: У класса Car есть приватные поля engine и fuel, доступ к которым осуществляется через публичные методы startEngine() и refuel().

    public class Car {
        private Engine engine;
        private int fuel;
        public void StartEngine() {
            // Logic to start engine
        }
        public void Refuel(int amount) {
            // Logic to refuel
        }
    }
  2. Наследование:

    • Создание нового класса на основе существующего, с заимствованием свойств и методов.

    • Пример: Класс ElectricCar наследует от класса Car и добавляет свои особенности.

    public class ElectricCar : Car {
        public int BatteryLevel { get; set; }
        public void ChargeBattery(int amount) {
            // Logic to charge battery
        }
    }
  3. Полиморфизм:

    • Способность объектов разного типа обрабатывать данные через единый интерфейс.

    • Пример: Метод Drive принимает параметр типа Car, но может работать с объектами ElectricCar и GasCar.

    public void Drive(Car car) {
        car.StartEngine();
        // Drive logic
    }
  4. Абстракция:

    • Выделение общих характеристик объектов и создание абстрактных классов и интерфейсов.

    • Пример: Интерфейс IVehicle определяет методы StartEngine и Drive.

    public interface IVehicle {
        void StartEngine();
        void Drive();
    }
    public class Car : IVehicle {
        public void StartEngine() {
            // Logic to start engine
        }
        public void Drive() {
            // Drive logic
        }
    }

Дополнительные вопросы

  • От какого класса неявно наследуются все классы в .NET?
    • Все классы неявно наследуются от класса System.Object.
  • Разрешено ли множественное наследование в C#?
    • В C# не разрешено множественное наследование классов, но разрешено множественное наследование интерфейсов.

Что такое рекурсия?

Рекурсия — это поведение функции, при котором она вызывает сама себя. Такие функции называются рекурсивными. В отличие от цикла, они не просто повторяются несколько раз, а работают «внутри» друг друга


Что такое лямбда-выражение?

Лямбда-выражение — это краткая форма записи анонимного метода, используемая для создания делегатов или выражений.

Пример:

Func<int, int, int> add = (a, b) => a + b;

Лямбда-выражение (a, b) => a + b описывает функцию, которая принимает два аргумента и возвращает их сумму.


Что такое параллельное программирование (многопоточность) и его назначение? Какие классы используются?

Параллельное программирование или многопоточность — это подход к разработке программ, при котором различные части кода выполняются параллельно в нескольких потоках. Это позволяет улучшить производительность программы, эффективно использовать ресурсы многопроцессорных систем, улучшить отзывчивость приложения и повысить его отказоустойчивость.

В .NET для реализации параллельного программирования существует несколько классов и инструментов, основными из которых являются:

  1. Класс Thread:

    • Представляет поток выполнения в .NET.

    • Создание и управление потоками напрямую с помощью класса Thread требует определенного уровня низкоуровневых навыков и может быть не самым удобным способом реализации параллельного программирования.

  2. Пространство имен System.Threading.Tasks:

    • Предоставляет более высокоуровневый и удобный способ работы с параллельными задачами.

    • Task представляет операцию, которая может завершиться в будущем. Она не обязана выполняться параллельно или занимать отдельный поток.

  3. Пространство имен System.Threading:

    • Содержит множество классов и методов для работы с многопоточностью, включая ThreadPool, Mutex, Monitor, Semaphore и другие.
  4. Асинхронное программирование:

    • Классы и методы для работы с асинхронным программированием, такие как ключевые слова async/await, асинхронные методы и классы Task и Task<T>, позволяют реализовать асинхронные операции без блокировки основного потока.

Использование этих классов и инструментов позволяет разработчикам создавать параллельные и асинхронные приложения в .NET, которые могут эффективно использовать мощности многопроцессорных систем и предоставлять более отзывчивый и отказоустойчивый пользовательский опыт.


Какие GoF-паттерны использовали?

Шаблоны проектирования GoF — это набор классических шаблонов проектирования, описанных в книге “Design Patterns: Elements of Reusable Object-Oriented Software”. В .NET разработке также используются различные шаблоны проектирования GoF для улучшения архитектуры и повышения гибкости приложений.

Ниже приведены некоторые из популярных GoF-паттернов, которые часто используются в .NET:

  1. Паттерн Фабричный метод (Factory Method):

    • Используется для определения интерфейса создания объекта, но позволяет подклассам изменять тип создаваемого объекта.

    • В .NET его можно реализовать с помощью интерфейсов или абстрактных классов.

  2. Паттерн Одиночка (Singleton):

    • Гарантирует, что класс имеет только один экземпляр, и предоставляет глобальный доступ к этому экземпляру.

    • Реализовать можно, например, с использованием статического поля и ленивой инициализации.

  3. Паттерн Адаптер (Adapter):

    • Преобразует интерфейс одного класса в интерфейс другого класса, который клиентский код ожидает.

    • В .NET его можно использовать для адаптации различных интерфейсов или классов.

  4. Паттерн Декоратор (Decorator):

    • Позволяет добавлять дополнительную функциональность объектам динамически.

    • Декоратор оборачивает объект с тем же интерфейсом и добавляет поведение до или после делегирования вызова. Методы расширения сами по себе этот паттерн не реализуют.

Эта страница была полезной?