C# | Вопросы собесов
Kanalga Telegram’da o‘tish
Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @sendme_ads
Ko'proq ko'rsatish5 006
Obunachilar
-124 soatlar
-107 kun
-230 kun
Postlar arxiv
5 004
🤔 Расскажи про принцип подстановки Барбары Лисков?
Принцип подстановки Барбары Лисков (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, легче тестировать, так как можно заменять объекты их подтипами в тестах без изменения поведения.
➕Повышенная поддерживаемость:
Такой код легче поддерживать и рефакторить, так как контракт между базовым и производным классами чётко определён и соблюдается.
Ставь 👍 и забирай 📚 Базу знаний5 004
Если ты Junior .NET разработчик и хочешь выйти на новый уровень 📈 — время прокачать навыки с Level Up!
Приглашаем на бесплатный live coding практикум «Разработка системы учёта проездных билетов за 60 минут» с преподавателем курса 18 октября в 19:00 МСК.
💡 Что узнаете:
Инструменты разработки на .NET.
Как создать веб-приложение на C# и интегрировать его с базой Postgres.
📅 Заявка на практикум
5 004
🤔 Что такое делегат?
Делегат в C# — это тип, который представляет ссылки на методы с определённой сигнатурой. Делегаты используются для передачи методов в качестве параметров и для обратных вызовов (callbacks). Они являются основой для событий и лямбда-выражений в C#. Делегаты позволяют вызывать методы динамически, что делает код более гибким.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 004
🤔 Что такое полиморфизм подтипов?
Полиморфизм подтипов — это способность объектов разных классов, связанных отношениями наследования, обрабатываться единообразно. Это позволяет использовать объекты подклассов через ссылки на базовые классы, что делает код гибким и расширяемым.
🚩Основные понятия
🟠Наследование:
Классы могут наследовать другие классы, унаследуя их методы и свойства.
🟠Интерфейсы:
Классы могут реализовывать интерфейсы, обеспечивая конкретную реализацию методов интерфейса.
🟠Виртуальные методы:
Методы, объявленные как
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();
}
}
}
Ставь 👍 и забирай 📚 Базу знаний5 004
🤔 Что такое принципы SOLID?
SOLID — это набор пяти принципов объектно-ориентированного программирования, которые помогают писать гибкий и поддерживаемый код. Принципы включают: Single Responsibility (одна ответственность), Open/Closed (открытость для расширения, закрытость для изменений), Liskov Substitution (подстановка Барбары Лисков), Interface Segregation (разделение интерфейсов) и Dependency Inversion (инверсия зависимостей). Эти принципы помогают избежать излишней сложности и улучшить структуру программного кода. Применение SOLID делает код более устойчивым к изменениям и легче в сопровождении.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
5 004
🤔 Что такое статический полиморфизм?
Статический полиморфизм, также известный как полиморфизм на этапе компиляции, — это форма полиморфизма, при которой вызов метода или доступ к члену определяется во время компиляции, а не во время выполнения. Статический полиморфизм достигается с помощью таких механизмов, как перегрузка методов (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
}
}
Ставь 👍 и забирай 📚 Базу знаний5 004
🤔 Что такое Inversion of control и dependency injection?
Inversion of control (IoC) — это принцип, при котором управление созданием объектов передается внешним компонентам. Dependency injection (DI) — это один из способов реализации IoC, когда зависимости передаются объекту через конструктор, методы или свойства. Это позволяет улучшить тестируемость и модульность кода. DI делает систему более гибкой, позволяя изменять реализации зависимостей без изменения кода.
Ставь 👍 и забирай 📚 Базу знаний
5 004
Обучаем Java-разработчиков оплата после выхода на работу
В Kata Academy можно выучиться на Java-разработчика бесплатно, а заплатить уже после трудоустройства по специальности из фактической зарплаты.
Если задуматься, то все в выигрыше:
— ты получаешь работу в Москве или Санкт-Петербурге с хорошей зарплатой, мы получаем процент за инвестиции в тебя;
— в наших интересах научить тебя так, чтобы твоя зарплата была как можно выше;
— мы прокачиваем твои навыки еще 2 года после курса: проводим выездные мероприятия и мастер-классы — и доходы наших выпускников растут;
— мы не зависим от банков и их рассрочек — кризис не повлиял на доступность курсов.
Чтобы попасть на курс, нужно выполнить небольшое тестовое задание. Переходи по ссылке и оставляй заявку!
Узнать больше
#реклама 16+
kata.academy
О рекламодателе
5 004
🤔 Как работает 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".
Ставь 👍 и забирай 📚 Базу знаний5 004
🤔 В чём разница абстрактного класса и интерфейса?
Абстрактный класс может содержать как реализацию методов, так и абстрактные методы, а интерфейс — только определения методов без реализации. Абстрактные классы могут иметь поля и конструкторы, а интерфейсы — нет. Класс может наследовать только один абстрактный класс, но реализовать несколько интерфейсов. Интерфейсы предоставляют более гибкий способ организации контракта для классов.
Ставь 👍 и забирай 📚 Базу знаний
5 004
🤔 Что такое 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); // Выведет строку подключения
🚩Зачем нужен?
🟠Общие данные и функции:
Статические члены полезны для хранения данных или функций, которые должны быть общими для всех экземпляров класса.
🟠Упрощение доступа:
Позволяет вызывать методы и свойства без необходимости создавать экземпляр класса.
🟠Инициализация ресурсов:
Статические конструкторы полезны для инициализации ресурсов или настройки параметров, необходимых для работы класса.
🚩Ограничения
🟠Статические методы не могут обращаться к нестатическим членам напрямую, так как у них нет доступа к экземпляру класса.
🟠Статические конструкторы не могут иметь параметры и вызываются автоматически при первом обращении к классу.
Ставь 👍 и забирай 📚 Базу знаний5 004
Прошел тест ASP NET - навыки прокачал, зарплату поднял! 😎
8 бонусов для справившихся - уроки по «горячим» темам, список литературы, карта развития навыков специалиста.
Ну и приличная скидка на курс по C# ASP.NET Core разработчик ждет тебя, смельчак!
✅ Испытание для избранных начинается тут: https://otus.pw/j7A4/?erid=LjN8KSWMh
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
5 004
+9
Помощь в трудоустройстве в IT-сфере!
По всей России объявили бесплатную программу на шестимесячное обучение по IT-cпециальностям.
Запись на участие в программе продлится до конца июля, но чтобы туда попасть, нужно пройти специальный профтест.
По результату тестирования сразу узнаете, какая профессия вам подойдет, и проходите ли вы на бесплатное обучение.
Перейти на сайт
#реклама 16+
urban-university.ru
О рекламодателе
5 004
🤔 Как проводить тестирование и отладку?
Тестирование программного обеспечения включает планирование тестов, их выполнение для проверки функциональности и других аспектов, а отладка занимается устранением найденных в ходе тестирования ошибок через анализ кода и логов.
🟠Использование отладчика (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 для анализа дампов.
Ставь 👍 и забирай 📚 Базу знаний5 004
⚡️ 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
➡️ Сохраняйте себе, чтобы не потерять
5 004
🤔 Как работаешь с асинхронными операциями?
Работа с асинхронными операциями в 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}");
}
}
Ставь 👍 и забирай 📚 Базу знаний5 004
+4
Senior-разработчик создал крутейший канал про SQL
Благодаря простым картинкам даже новичок научится разрабатывать приложения с использованием баз данных.
Присоединяйтесь: @SQL
