Реализуется с помощью перегрузки методов (методы в одном классе имеют одинаковое имя, но различаются количеством или типом параметров) и перегрузки операторов. Статический полиморфизм определяется во время компиляции.
class MathOperations
{
public int Multiply(int a, int b)
{
return a * b;
}
public int Multiply(int a, int b, int c)
{
return a * b * c;
}
}
Реализуется с помощью переопределения методов (когда методы в дочернем классе переопределяют методы родительского класса). Динамический полиморфизм использует механизм виртуальных методов и их переопределения (override) и определяется во время выполнения программы.
class Animal
{
public virtual void MakeSound()
{
Console.WriteLine("Some sound");
}
}
class Dog : Animal
{
public override void MakeSound()
{
Console.WriteLine("Woof");
}
}
В этом примере метод
MakeSound в классе Animal переопределяется в классе Dog для предоставления реализации, специфичной для собак. При вызове MakeSound на экземпляре Dog будет использоваться переопределенная версия метода, что является демонстрацией динамического полиморфизма.Полиморфизм упрощает добавление новых классов и функциональностей в программы без изменения существующего кода. Он способствует уменьшению связанности компонентов системы, упрощению ее расширения и облегчению поддержки. Полиморфизм также играет важную роль в реализации принципов SOLID, в частности, в обеспечении гибкости и масштабируемости программного обеспечения.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Anonymous Quiz
31%
Виртуальный метод будет вызван, как обычно
6%
Виртуальный метод вызовет исключение
38%
Виртуальный метод вызовет версию метода в базовом классе, а не в производном
24%
Компилятор не позволит вызвать виртуальный метод из конструктора
🤯7😁1
Инкапсуляция заключается в сокрытии внутреннего состояния объекта от внешнего мира и предоставлении публичного интерфейса для взаимодействия с объектом. Это позволяет скрыть сложность внутри объектов и изменять внутреннюю реализацию без вреда для других частей программы.
Наследование позволяет создавать новые классы на основе уже существующих, перенимая их свойства и методы. Это обеспечивает иерархическую организацию классов и уменьшает дублирование кода.
Полиморфизм дает возможность использовать объекты разных классов с одинаковым интерфейсом без информации о внутренней структуре объекта. В результате один и тот же метод может быть использован в разных контекстах для объектов разных типов.
Абстракция позволяет сконцентрироваться на важных характеристиках объекта, не углубляясь в детали его реализации. Это достигается за счет определения абстрактных классов и интерфейсов, которые описывают общий для группы объектов функционал.
public abstract class Животное
{
public abstract void Голос(); // Абстрактный метод, определение голоса животного
}
public class Собака : Животное
{
public override void Голос()
{
Console.WriteLine("Гав");
}
}
public class Кошка : Животное
{
public override void Голос()
{
Console.WriteLine("Мяу");
}
}
class Program
{
static void Main(string[] args)
{
Животное мояСобака = new Собака();
мояСобака.Голос(); // Вывод: Гав
Животное мояКошка = new Кошка();
мояКошка.Голос(); // Вывод: Мяу
}
}
В этом примере класс
Животное абстрагирует общее понятие животного с методом Голос. Классы Собака и Кошка наследуют от Животное и реализуют метод Голос, демонстрируя полиморфизм — один интерфейс, разные реализации.ООП — это подход, который использует объекты для моделирования данных и поведения программы. Основывается на четырех столпах: инкапсуляция, наследование, полиморфизм и абстракция, что облегчает разработку, тестирование и поддержку сложных программных систем.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Anonymous Quiz
46%
Array.CopyTo()
30%
Array.Copy()
23%
Array.Clone()
1%
Array.Transfer()
Это подход, при котором задача может выполняться независимо от основного потока программы, и не блокирует его выполнение в ожидании завершения. Это позволяет программе продолжать работу, пока выполняется асинхронная операция, например, доступ к файлу или сетевой запрос. Ключевая особенность асинхронности заключается в том, что она позволяет обрабатывать задачи без блокировки, улучшая отзывчивость и производительность приложения, особенно в средах с графическим интерфейсом пользователя или в серверных приложениях.
Это подход, при котором несколько потоков исполнения работают параллельно, что позволяет выполнять несколько операций одновременно. Это может быть реализовано как на одном процессоре с использованием временной мультиплексированной многозадачности, так и на многоядерных процессорах, где каждый поток может выполняться фактически одновременно на своем ядре. Многопоточность идеально подходит для задач, требующих тяжелых вычислений, и может значительно ускорить выполнение программы за счет распараллеливания работы.
Асинхронность обычно используется для улучшения отзывчивости приложений и эффективного использования ожидания (например, I/O операции), тогда как многопоточность применяется для ускорения выполнения вычислительно сложных задач за счет параллелизма.
Асинхронные операции часто управляются операционной системой и могут использовать меньше ресурсов, поскольку не требуют постоянного выделения отдельного потока. Многопоточность требует более активного управления потоками, что может привести к большему потреблению памяти и процессорного времени.
Работа с многопоточностью часто более сложна из-за необходимости синхронизации доступа к общим ресурсам и управления состоянием, что может привести к ошибкам, таким как взаимные блокировки и состояния гонки. Асинхронное программирование также требует понимания, но оно более структурировано и часто управляется с помощью высокоуровневых паттернов и библиотек.
Оба эти подхода важны в современной разработке ПО и могут использоваться вместе для создания высокопроизводительных, масштабируемых и отзывчивых приложений.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Anonymous Quiz
17%
Это тип, который определяет метод
70%
Это объект, который содержит ссылку на метод
9%
Это метод, который вызывает другой метод
3%
Это класс, который определяет событие
👾4
Это основной класс в EF, который управляет взаимодействием с базой данных. Он предоставляет доступ к функциональности, такой как выполнение запросов, сохранение данных и настройка моделей.
Это коллекции объектов определенного класса, которые представляют собой таблицы в базе данных. Классы, которые представляют данные в таблицах, обычно называются сущностями.
EF позволяет использовать LINQ (Language Integrated Query) для написания запросов к базе данных, которые затем транслируются в SQL-запросы. Это позволяет разработчикам писать запросы к данным в объектно-ориентированном стиле на C#.
EF поддерживает механизм миграций для управления изменениями в структуре базы данных по мере развития приложения. Миграции позволяют автоматически обновлять схему базы данных в соответствии с изменениями в моделях данных.
Entity Framework использует набор конвенций для автоматического маппинга классов на таблицы и их свойств на столбцы. Разработчики могут переопределить и дополнить эти конвенции с помощью аннотаций данных или Fluent API.
Последняя версия для .NET Framework. EF6 продолжает поддерживаться и развиваться, включая новые функции и исправления ошибок.
Современная, легковесная, расширяемая и кросс-платформенная версия Entity Framework, разработанная для .NET Core. EF Core предназначен для использования в модернизированных и масштабируемых приложениях и поддерживает широкий спектр баз данных.
using (var context = new BloggingContext())
{
var blog = new Blog { Url = "https://blogs.msdn.com/adonet" };
context.Blogs.Add(blog);
context.SaveChanges();
var blogs = context.Blogs
.Where(b => b.Url.Contains("msdn"))
.ToList();
foreach (var b in blogs)
{
Console.WriteLine(b.Url);
}
}
В этом примере создается новый объект
Blog, добавляется в контекст и сохраняется в базе данных. Затем выполняется запрос для извлечения блогов с определенным URL.Entity Framework значительно упрощает работу с реляционными базами данных, позволяя разработчикам сосредоточиться на бизнес-логике, вместо деталей реализации доступа к данным. Он предлагает мощные инструменты для абстракции доступа к данным, что делает код чище, проще для понимания и поддержки.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Anonymous Quiz
13%
Код выполнится синхронно
8%
Метод выбросит исключение во время выполнения
71%
Метод не скомпилируется
7%
Метод будет ожидать асинхронного выполнения
❤1
Индексируют значения одного столбца таблицы. Это основной тип индекса, используемый для ускорения запросов, фильтрующих или сортирующих данные по одному столбцу.
Индексируют значения, основанные на нескольких столбцах. Они полезны, когда операции выборки, сортировки или объединения таблиц часто используют одни и те же комбинации столбцов.
Гарантируют, что индексируемые значения уникальны. Они часто используются для обеспечения уникальности столбцов или набора столбцов в таблице.
Позволяют проводить полнотекстовый поиск по текстовым данным в базе данных. Они оптимизированы для поиска слов в больших текстовых полях и часто используются в системах, где требуется поиск по содержимому статей, блогов и других текстовых документов.
Используются для индексации пространственных данных, таких как географические объекты. Они оптимизируют запросы, включающие пространственные операции, такие как нахождение объектов внутри заданной области.
На практике индексы — это мощный инструмент для оптимизации производительности баз данных. Однако они должны использоваться осмысленно.
Использование индексов должно начинаться с анализа наиболее часто выполняемых запросов и понимания структуры данных. Профилирование и анализ планов выполнения запросов помогут определить, где индексы могут быть полезны.
Несмотря на преимущества ускорения чтения, индексы добавляют накладные расходы на операции записи. Каждая операция вставки, удаления или изменения данных требует обновления индексов, что может замедлить эти операции.
С течением времени индексы могут фрагментироваться, особенно в активно изменяемых базах данных. Регулярное обслуживание, такое как реорганизация и перестроение индексов, помогает поддерживать их производительность на оптимальном уровне.
Индексы особенно полезны в больших базах данных, где правильно построенные индексы могут сократить время ответа запросов с нескольких минут до секунд. Важно помнить о затратах на поддержание индексов и влиянии на производительность операций записи. Поэтому перед созданием индекса всегда следует тщательно анализировать и тестировать его влияние на систему.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Anonymous Quiz
21%
Объект выбросит исключение
25%
Объект вызовет Dispose() только один раз
44%
Ничего, метод Dispose() можно безопасно вызывать несколько раз
11%
Метод Dispose() вызовет Finalize()
Сборка мусора (Garbage Collection, GC) автоматически управляет выделением и освобождением памяти в управляемом куче. Сборка мусора инициируется автоматически в следующих ситуациях:
Если приложению требуется больше памяти для выделения объектов в управляемой куче и доступной памяти недостаточно, CLR (Common Language Runtime) автоматически инициирует сборку мусора для освобождения памяти, занятой неиспользуемыми объектами.
.NET Framework использует алгоритм, который основывается на объеме выделенной памяти. Для каждого поколения объектов (0, 1, и 2) определен пороговый объем выделенной памяти. Когда приложение выделяет память и этот порог достигается, происходит сборка мусора соответствующего поколения.
Разработчики могут явно запросить сборку мусора, вызвав метод
GC.Collect(). Однако использовать этот метод нужно осторожно, так как его неправильное использование может привести к снижению производительности приложения. В большинстве случаев следует избегать явного вызова сборки мусора и полагаться на автоматическое управление памятью CLR.При завершении работы приложения .NET Framework автоматически выполняет сборку мусора для очистки всех управляемых объектов, даже если они еще доступны.
Если операционная система сообщает о низком уровне доступной памяти, CLR может инициировать сборку мусора в попытке освободить память для системы.
Сборка мусора проектировалась таким образом, чтобы минимизировать необходимость вмешательства программиста в процесс управления памятью. Она позволяет автоматически решать большинство задач по освобождению памяти, что значительно упрощает разработку и повышает надежность программ на .NET.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
Anonymous Quiz
12%
Компилятор выбросит ошибку
11%
Методы будут перегружены
72%
Класс должен явно указать, какой метод интерфейса реализован
4%
Методы будут объединены в один
Структуры (struct) и классы (class) являются двумя основными конструкциями, используемыми для определения типов данных. Хотя на первый взгляд они могут казаться похожими, между ними есть несколько ключевых различий:
Классы в C# являются ссылочными типами. Это означает, что при присваивании объекта класса переменной или передаче его методу создается ссылка на объект, а не копия самого объекта. Все переменные класса указывают на один и тот же экземпляр в памяти.
Структуры — это значимые типы. Когда структура присваивается другой переменной или передается методу, создается копия всей структуры. Изменения одной копии не влияют на другую.
Классы поддерживают как интерфейсное, так и классовое наследование, то есть класс может наследовать поведение другого класса.
Структуры могут реализовывать интерфейсы, но не могут наследовать от других структур или классов. Также структуры не могут быть базовыми для других структур или классов.
Классы могут иметь конструкторы с параметрами и без параметров.
Структуры не могут иметь явно определенного конструктора без параметров, так как автоматически предоставляется конструктор по умолчанию, который инициализирует все поля значениями по умолчанию. Структуры могут иметь конструкторы с параметрами.
Переменные класса могут быть
null, если им не присвоен экземпляр объекта.Структуры не могут иметь значение
null, поскольку они всегда содержат значение.Так как объекты класса хранятся в куче, работа с классами может привести к дополнительным затратам на управление памятью и сборку мусора.
Поскольку структуры хранятся в стеке и не требуют сборки мусора, работа с ними может быть более быстрой, особенно когда они маленькие и используются в кратковременных или локальных контекстах.
public struct Point
{
public int X;
public int Y;
public Point(int x, int y)
{
X = x;
Y = y;
}
}
public class Circle
{
public Point Center;
public double Radius;
public Circle(int x, int y, double radius)
{
Center = new Point(x, y);
Radius = radius;
}
}
Выбор между структурой и классом зависит от требований к производительности, использования памяти и функциональности программы.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5👾1
Anonymous Quiz
16%
dynamic
81%
var
1%
auto
1%
let
Сервис локатор (Service Locator) — это шаблон проектирования, используемый в программировании для управления зависимостям между компонентами. Шаблон сервис локатора предоставляет централизованный реестр, где компоненты могут регистрировать свои сервисы и услуги, а другие части приложения — искать их по необходимости. Это отличается от инъекции зависимостей, где зависимости передаются компонентам через конструкторы или свойства.
Сервис локатор содержит реестр всех доступных сервисов. Каждый сервис ассоциируется с уникальным ключом или идентификатором.
Компоненты приложения могут запрашивать нужные сервисы из локатора, предоставляя соответствующий ключ или идентификатор.
Сервис локатор помогает управлять зависимостями в приложении, позволяя компонентам работать независимо от конкретных реализаций сервисов, с которыми они взаимодействуют.
public interface IService
{
void Execute();
}
public class ServiceLocator
{
private IDictionary<object, IService> services;
public ServiceLocator()
{
services = new Dictionary<object, IService>();
}
public void RegisterService<T>(IService service)
{
services.Add(typeof(T), service);
}
public IService GetService<T>()
{
return services[typeof(T)];
}
}
public class ConcreteService : IService
{
public void Execute()
{
Console.WriteLine("Service Executed");
}
}
class Program
{
static void Main()
{
ServiceLocator locator = new ServiceLocator();
locator.RegisterService<IService>(new ConcreteService());
IService service = locator.GetService<IService>();
service.Execute(); // Output: Service Executed
}
}
Компоненты не зависят от способов создания их зависимостей, что упрощает изменения и тестирование.
Легко добавить новый сервис или изменить существующий без изменения потребляющих его компонентов.
Зависимости между компонентами и их сервисами не всегда ясны, что может привести к более сложному коду и затруднить его понимание и поддержку.
По мере роста приложения управление всеми сервисами через локатор может стать сложным и неудобным.
Сервис локатор может быть полезен в ситуациях, когда нужна высокая степень гибкости и динамичности в управлении зависимостями, но его использование должно быть оправдано требованиями проекта, так как оно вносит дополнительную сложность в архитектуру приложения.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Anonymous Quiz
15%
try-catch
11%
return
7%
await
68%
lock
параметры => выражение
Где
=> называется лямбда оператором, который можно прочесть как "переходит к".() => Console.WriteLine("Привет, мир!");x => x * x; // Возвращает квадрат x
(x, y) => x + y; // Складывает x и y
Лямбда-выражения особенно полезны в LINQ (Language Integrated Query), где они используются для создания кратких и выразительных запросов к данным. Например, чтобы выбрать все положительные числа из списка, можно использовать лямбда-выражение следующим образом:
List<int> числа = new List<int> { -1, 0, 1, 2, 3, 4, 5 };
var положительныеЧисла = числа.Where(x => x > 0).ToList();
foreach (var число in положительныеЧисла)
{
Console.WriteLine(число);
}Лямбда-выражения также могут быть использованы для создания делегатов в событийно-ориентированных или асинхронных программах, делая код более лаконичным и легко читаемым.
Лямбда-выражения предоставляют мощный и гибкий способ работы с функциями, позволяя писать компактный и выразительный код. Они идеально подходят для выполнения операций с коллекциями, асинхронного программирования и везде, где требуется краткость и выразительность.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Anonymous Quiz
86%
Класс нельзя наследовать
2%
Класс нельзя создать
3%
Класс не может реализовать интерфейсы
8%
Класс не может содержать виртуальные методы
Middleware — это программные компоненты, которые выполняются при каждом запросе к приложению и обрабатываются в определенном порядке в виде конвейера. Эти компоненты могут выполнять различные задачи, такие как аутентификация, логирование, обработка ошибок, управление сессиями, и многое другое. Он позволяет добавлять и настраивать функциональность приложения в точках, через которые проходит HTTP-запрос или ответ.
Каждый его компонент имеет возможность обработать запрос перед тем, как он будет передан следующему компоненту в конвейере, а также может изменять ответ после выполнения последующих компонентов. Такая архитектура позволяет создавать легко расширяемые и модульные приложения.
Middleware конфигурируется в методе
Configure класса Startup. Порядок, в котором компоненты middleware добавляются в конвейер с помощью метода Use..., определяет порядок их выполнения при обработке запроса и ответа.public class MyMiddleware
{
private readonly RequestDelegate _next;
public MyMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
// До вызова следующего компонента в конвейере
Console.WriteLine("Before");
await _next(context); // Передача управления следующему middleware
// После возвращения управления от следующих компонентов
Console.WriteLine("After");
}
}
// Регистрация middleware в Startup.cs
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseMiddleware<MyMiddleware>();
// Другие компоненты middleware
}
Middleware часто используют для следующих задач:
проверка пользовательских данных и определение прав доступа.
запись информации о запросах и ответах для последующего анализа.
централизованная обработка исключений и формирование соответствующих ответов клиенту.
поддержка пользовательских сессий и управление куками.
обработка запросов к статическим файлам, таким как HTML, CSS, изображения.
Middleware обеспечивает гибкую и мощную систему для управления потоком HTTP-запросов и ответов, позволяя разработчикам легко добавлять и настраивать необходимую функциональность в своих веб-приложениях.
Middleware в ASP.NET Core — это компоненты, которые работают с каждым запросом и ответом в приложении, формируя конвейер для обработки HTTP-сообщений. Они позволяют добавлять нужную функциональность, например, для логирования, аутентификации или обработки ошибок, делая приложение модульным и легко поддерживаемым.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Делегат — это тип, который безопасно инкапсулирует метод, подобно указателю на функцию в других языках программирования, но с проверкой типов во время компиляции. Делегаты могут ссылаться на метод, который принимает параметры и возвращает значение. Они используются для реализации обратных вызовов и событий, а также для определения пользовательских операций, которые могут быть выполнены методом, принимаемым в качестве параметра.
Делегаты предоставляют способ передачи методов в качестве аргументов другим методам. Это полезно для реализации шаблонов проектирования, таких как наблюдатель (Observer), стратегия (Strategy), и для создания асинхронных вызовов. Они позволяют абстрагироваться от конкретных методов, передавая вместо этого ссылку на метод, что делает код более гибким и масштабируемым.
// Определение делегата
public delegate int Operation(int x, int y);
class Program
{
static void Main(string[] args)
{
// Создание экземпляра делегата, ссылающегося на метод Add
Operation op = Add;
// Вызов метода через делегат
int result = op(5, 5);
Console.WriteLine(result); // Вывод: 10
// Делегат теперь ссылается на метод Subtract
op = Subtract;
// Повторный вызов метода через делегат
result = op(10, 5);
Console.WriteLine(result); // Вывод: 5
}
static int Add(int x, int y)
{
return x + y;
}
static int Subtract(int x, int y)
{
return x - y;
}
}
В этом примере делегат
Operation может ссылаться на любой метод, который принимает два целочисленных параметра и возвращает целое число. Сначала делегат ссылается на метод Add, затем на Subtract. Это демонстрирует, как можно динамически изменять методы, на которые указывает делегат, обеспечивая гибкость в выборе выполняемой операции.Делегаты — мощный инструмент для создания гибких и масштабируемых приложений, позволяющий передавать методы как параметры, использовать их для определения событий и реализовывать асинхронные операции. Они обеспечивают безопасный и типобезопасный способ работы с методами в качестве объектов первого класса.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4