Anonymous Quiz
21%
Union
49%
Intersect
8%
Concat
22%
Join
👀5
Мультикаст-делегат в C# - это тип делегата, который может ссылаться на несколько методов. Это позволяет вызывать несколько методов в одном вызове делегата. Такая возможность полезна для выполнения последовательности действий, таких как уведомление нескольких подписчиков о событии.
Создадим простой пример, где мультикаст-делегат используется для уведомления нескольких методов:
using System;
public class Program
{
// Определяем делегат, который принимает строку и ничего не возвращает
public delegate void Notify(string message);
// Метод, который соответствует сигнатуре делегата
public static void SendEmail(string message)
{
Console.WriteLine($"Email sent: {message}");
}
// Другой метод, который соответствует сигнатуре делегата
public static void LogMessage(string message)
{
Console.WriteLine($"Log entry: {message}");
}
public static void Main()
{
// Создаем экземпляр делегата и добавляем методы
Notify notifyDel = SendEmail;
notifyDel += LogMessage;
// Вызываем делегат
notifyDel("System update available.");
// Удаляем метод из делегата
notifyDel -= LogMessage;
// Вызываем делегат снова
notifyDel("Security patch applied.");
}
}
Notify, который принимает строку в качестве параметра и не возвращает значение.SendEmail и LogMessage, которые соответствуют сигнатуре делегата Notify.LogMessage из списка вызовов делегата.Мультикаст-делегат - это делегат, который может ссылаться на несколько методов и вызывать их последовательно. Это полезно для выполнения нескольких действий в одном вызове, таких как уведомление нескольких подписчиков о событии.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤1
Anonymous Quiz
86%
finally
12%
catch
0%
dispose
1%
using
IoC (Inversion of Control) контейнеры – это фреймворки или библиотеки, которые управляют созданием и внедрением зависимостей в приложении. Они помогают реализовать принцип внедрения зависимостей (Dependency Injection), что делает код более гибким, тестируемым и легко расширяемым.
Рассмотрим простой пример использования популярного IoC-контейнера Autofac в C#:
public interface ILogger
{
void Log(string message);
}
public class ConsoleLogger : ILogger
{
public void Log(string message)
{
Console.WriteLine(message);
}
}
public interface IService
{
void Serve();
}
public class Service : IService
{
private readonly ILogger _logger;
public Service(ILogger logger)
{
_logger = logger;
}
public void Serve()
{
_logger.Log("Service Called");
}
}
using Autofac;
class Program
{
static void Main(string[] args)
{
var builder = new ContainerBuilder();
// Регистрируем зависимости
builder.RegisterType<ConsoleLogger>().As<ILogger>();
builder.RegisterType<Service>().As<IService>();
// Строим контейнер
var container = builder.Build();
// Разрешаем зависимости
var service = container.Resolve<IService>();
service.Serve();
}
}
ILogger и IService, а также их реализации ConsoleLogger и Service.ContainerBuilder регистрируем классы ConsoleLogger и Service как реализации соответствующих интерфейсов.Serve у объекта Service, который использует ConsoleLogger для логирования.IoC-контейнеры управляют созданием и внедрением зависимостей в приложении, упрощая тестирование и организацию кода. Они позволяют регистрировать и разрешать зависимости, делая код более гибким и легко расширяемым.
Please open Telegram to view this post
VIEW IN TELEGRAM
Anonymous Quiz
64%
Dispose()
12%
SuppressFinalize()
22%
Collect()
2%
Abort()
👾1
Принцип подстановки Барбары Лисков (Liskov Substitution Principle, LSP) - это один из пяти принципов SOLID, который гласит, что объекты подтипов должны быть заменяемы объектами базового типа без нарушения правильности работы программы. Это означает, что если класс
B является подтипом класса A, то объекты класса A могут быть заменены объектами класса B без изменения желаемого поведения программы.Рассмотрим пример, где нарушение LSP приводит к некорректному поведению программы:
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 = base.Height = value; }
}
public override int Height
{
set { base.Width = base.Height = value; }
}
}
В этом примере
Square (квадрат) наследует от Rectangle (прямоугольник). Однако, квадрат имеет особое свойство: его ширина и высота всегда равны. При попытке установить ширину или высоту квадрата, изменяется и другое значение, что нарушает поведение прямоугольника.Лучше использовать композицию вместо наследования для избежания такой проблемы:
public interface IShape
{
int GetArea();
}
public class Rectangle : IShape
{
public int Width { get; set; }
public int Height { get; set; }
public int GetArea()
{
return Width * Height;
}
}
public class Square : IShape
{
public int SideLength { get; set; }
public int GetArea()
{
return SideLength * SideLength;
}
}
Rectangle и Square реализуют интерфейс IShape, но теперь они не наследуются друг от друга и имеют свои собственные свойства и методы.Принцип подстановки Лисков гласит, что объекты подтипов должны быть заменяемы объектами базового типа без нарушения работы программы. Это необходимо для повышения предсказуемости, надежности и расширяемости кода.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5👾1
Anonymous Quiz
73%
virtual
14%
abstract
12%
override
1%
sealed
В C# существует множество коллекций, которые предоставляются в стандартной библиотеке .NET. Они делятся на несколько категорий, каждая из которых предназначена для различных сценариев использования. Вот основные типы коллекций:
List<int> numbers = new List<int> { 1, 2, 3, 4 };
numbers.Add(5);
Dictionary<string, int> ages = new Dictionary<string, int>
{
{ "Alice", 30 },
{ "Bob", 25 }
};
int aliceAge = ages["Alice"];
HashSet<string> fruits = new HashSet<string> { "Apple", "Banana" };
fruits.Add("Apple"); // Не добавит дубликат
Queue<string> queue = new Queue<string>();
queue.Enqueue("first");
queue.Enqueue("second");
string item = queue.Dequeue(); // "first"
Stack<string> stack = new Stack<string>();
stack.Push("first");
stack.Push("second");
string item = stack.Pop(); // "second"
LinkedList<int> linkedList = new LinkedList<int>();
linkedList.AddLast(1);
linkedList.AddLast(2);
SortedList<string, int> sortedList = new SortedList<string, int>
{
{ "Alice", 30 },
{ "Bob", 25 }
};
SortedList, но использует бинарное дерево для хранения элементов. SortedDictionary<string, int> sortedDict = new SortedDictionary<string, int>
{
{ "Alice", 30 },
{ "Bob", 25 }
};
SortedSet<int> sortedSet = new SortedSet<int> { 3, 1, 2 };
Dictionary, предназначенная для безопасного использования в многопоточных приложениях. ConcurrentDictionary<string, int> concurrentDict = new ConcurrentDictionary<string, int>();
concurrentDict.TryAdd("Alice", 30);
Queue. ConcurrentQueue<string> concurrentQueue = new ConcurrentQueue<string>();
concurrentQueue.Enqueue("first");
Stack. ConcurrentStack<string> concurrentStack = new ConcurrentStack<string>();
concurrentStack.Push("first");
BlockingCollection<int> blockingCollection = new BlockingCollection<int>(5);
blockingCollection.Add(1);
В C# есть множество коллекций для различных целей, включая
List, Dictionary, HashSet, Queue, Stack, специализированные коллекции, такие как LinkedList, SortedList, а также коллекции для параллельного программирования, такие как ConcurrentDictionary и BlockingCollection.Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Dependency Injection (DI), или инъекция зависимости, — это шаблон проектирования, который позволяет объектам получить свои зависимости от внешних источников, а не создавать их самостоятельно. Этот подход улучшает тестируемость, расширяемость и поддерживаемость кода, делая его более гибким и модульным.
A использует класс B для выполнения своих задач, то B является зависимостью для A.public class Service
{
private readonly IRepository _repository;
public Service(IRepository repository)
{
_repository = repository;
}
public void DoWork()
{
_repository.Save();
}
}
public class Service
{
public IRepository Repository { get; set; }
public void DoWork()
{
Repository.Save();
}
}
public class Service
{
private IRepository _repository;
public void SetRepository(IRepository repository)
{
_repository = repository;
}
public void DoWork()
{
_repository.Save();
}
}
IoC-контейнеры (контейнеры инверсии управления) управляют созданием и жизненным циклом зависимостей, а также автоматизируют процесс их инъекции. Пример использования популярного IoC-контейнера Autofac:
using Autofac;
var builder = new ContainerBuilder();
builder.RegisterType<Repository>().As<IRepository>();
builder.RegisterType<Service>().As<IService>();
var container = builder.Build();
using (var scope = container.BeginLifetimeScope())
{
var service = scope.Resolve<IService>();
service.DoWork();
}
Dependency Injection (DI) — это метод предоставления зависимостей объекту извне, что делает код более гибким, тестируемым и поддерживаемым. DI может осуществляться через конструкторы, свойства или методы, а IoC-контейнеры автоматизируют процесс управления зависимостями.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Anonymous Quiz
18%
private
9%
protected
61%
internal
13%
protected internal
В C# списки (List) и массивы (Array) являются двумя основными типами коллекций, но они имеют различия в своих свойствах, возможностях и сценариях использования. Рассмотрим основные различия между ними.
int[] numbers = new int[5]; // Массив из 5 элементов
string[] words = new string[] { "apple", "banana", "cherry" };
int firstNumber = numbers[0]; // Быстрый доступ по индексу
Length. int length = numbers.Length; // Длина массива
List<int> numbersList = new List<int> { 1, 2, 3, 4, 5 };
numbersList.Add(6); // Добавление элемента увеличивает размер списка
List<string> wordsList = new List<string> { "apple", "banana", "cherry" };
int firstNumberInList = numbersList[0]; // Быстрый доступ по индексу
Add, Remove, Find, Count и многие другие, что делает их более удобными для работы с динамическими данными. int count = numbersList.Count; // Количество элементов в списке
numbersList.Remove(3); // Удаление элемента
Массив:
int[] numbersArray = new int[] { 1, 2, 3, 4, 5 };
int firstElement = numbersArray[0];
numbersArray[2] = 10;
Console.WriteLine(numbersArray.Length);Список:
List<int> numbersList = new List<int> { 1, 2, 3, 4, 5 };
numbersList.Add(6);
int firstElementInList = numbersList[0];
numbersList[2] = 10;
Console.WriteLine(numbersList.Count);
numbersList.Remove(4);Массивы имеют фиксированный размер и обеспечивают быстрый доступ к элементам, но менее гибкие. Списки имеют динамический размер и предоставляют больше методов для работы с элементами, но могут быть менее эффективны по памяти.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Anonymous Quiz
22%
virtual
73%
abstract
4%
sealed
1%
static
👍1
В C#
post чаще всего ассоциируется с HTTP POST-запросами, которые используются для отправки данных на сервер. Это один из основных методов HTTP-протокола наряду с GET, PUT, DELETE и другими. Для выполнения HTTP POST-запроса в C# часто используется класс
HttpClient, который предоставляет удобные методы для взаимодействия с веб-сервисами.System.Net.Http (обычно он включен по умолчанию в .NET Core проектах).using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
// Создаем HttpClient
using (HttpClient client = new HttpClient())
{
// URL-адрес, на который отправляется запрос
string url = "https://example.com/api/resource";
// Данные для отправки
var data = new
{
Name = "John Doe",
Age = 30
};
// Сериализуем данные в JSON
string jsonData = Newtonsoft.Json.JsonConvert.SerializeObject(data);
// Создаем содержимое запроса
StringContent content = new StringContent(jsonData, Encoding.UTF8, "application/json");
// Отправляем POST-запрос
HttpResponseMessage response = await client.PostAsync(url, content);
// Проверяем успешность ответа
if (response.IsSuccessStatusCode)
{
Console.WriteLine("Запрос выполнен успешно.");
}
else
{
Console.WriteLine($"Ошибка: {response.StatusCode}");
}
}
}
}
HttpClient используется для отправки HTTP-запросов и получения HTTP-ответов от ресурса, определенного по URI.JsonConvert.SerializeObject.StringContent, который содержит сериализованные данные, кодировку и тип содержимого.PostAsync отправляет POST-запрос на указанный URL с указанным содержимым.IsSuccessStatusCode.HTTP POST-запрос используется для отправки данных на сервер, обычно для создания новых ресурсов. В C# для выполнения POST-запросов часто используется класс
HttpClient, который позволяет отправлять данные в формате JSON или других форматах.Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
В C# и веб-программировании
PUT обычно относится к HTTP PUT-запросам, которые используются для обновления ресурсов на сервере. Это один из основных методов HTTP-протокола наряду с GET, POST, DELETE и другими.Для выполнения HTTP PUT-запроса в C# часто используется класс
HttpClient, который предоставляет удобные методы для взаимодействия с веб-сервисами.System.Net.Http (обычно он включен по умолчанию в .NET Core проектах).using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
// Создаем HttpClient
using (HttpClient client = new HttpClient())
{
// URL-адрес, на который отправляется запрос
string url = "https://example.com/api/resource/1"; // Предполагается, что ресурс с ID 1 уже существует
// Данные для отправки
var data = new
{
Name = "John Doe",
Age = 31 // Обновляем возраст
};
// Сериализуем данные в JSON
string jsonData = Newtonsoft.Json.JsonConvert.SerializeObject(data);
// Создаем содержимое запроса
StringContent content = new StringContent(jsonData, Encoding.UTF8, "application/json");
// Отправляем PUT-запрос
HttpResponseMessage response = await client.PutAsync(url, content);
// Проверяем успешность ответа
if (response.IsSuccessStatusCode)
{
Console.WriteLine("Ресурс успешно обновлен.");
}
else
{
Console.WriteLine($"Ошибка: {response.StatusCode}");
}
}
}
}
HttpClient используется для отправки HTTP-запросов и получения HTTP-ответов от ресурса, определенного по URI.JsonConvert.SerializeObject.StringContent, который содержит сериализованные данные, кодировку и тип содержимого.PutAsync отправляет PUT-запрос на указанный URL с указанным содержимым.HTTP PUT-запрос используется для обновления существующего ресурса или создания ресурса, если он не существует. В C# для выполнения PUT-запросов часто используется класс
HttpClient, который позволяет отправлять данные в формате JSON или других форматах. PUT-запросы идемпотентны, что означает, что многократное выполнение одного и того же запроса приведет к одному и тому же результату.Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Anonymous Quiz
26%
Func<int>
16%
Action<int>
10%
Predicate<int>
48%
Func<int, string>
В C# и веб-программировании
DELETE обычно относится к HTTP DELETE-запросам, которые используются для удаления ресурсов на сервере. Это один из основных методов HTTP-протокола наряду с GET, POST, PUT и другими.Для выполнения HTTP DELETE-запроса в C# часто используется класс
HttpClient, который предоставляет удобные методы для взаимодействия с веб-сервисами.System.Net.Http (обычно он включен по умолчанию в .NET Core проектах).using System;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
// Создаем HttpClient
using (HttpClient client = new HttpClient())
{
// URL-адрес, на который отправляется запрос
string url = "https://example.com/api/resource/1"; // Предполагается, что ресурс с ID 1 существует
// Отправляем DELETE-запрос
HttpResponseMessage response = await client.DeleteAsync(url);
// Проверяем успешность ответа
if (response.IsSuccessStatusCode)
{
Console.WriteLine("Ресурс успешно удален.");
}
else
{
Console.WriteLine($"Ошибка: {response.StatusCode}");
}
}
}
}
HttpClient используется для отправки HTTP-запросов и получения HTTP-ответов от ресурса, определенного по URI.DeleteAsync отправляет DELETE-запрос на указанный URL.IsSuccessStatusCode.HTTP DELETE-запрос используется для удаления ресурса на сервере. В C# для выполнения DELETE-запросов часто используется класс
HttpClient, который позволяет отправлять запросы и получать ответы от веб-сервисов. DELETE-запросы идемпотентны, что означает, что многократное выполнение одного и того же запроса приведет к одному и тому же результату — ресурс будет удален.Please open Telegram to view this post
VIEW IN TELEGRAM
Anonymous Quiz
68%
sealed
9%
static
10%
override
13%
private
В HTTP-протоколе используется множество кодов состояния, чтобы указать результат выполнения запросов. Наиболее популярные и часто встречающиеся коды ошибок группируются в диапазоны, каждый из которых указывает на определенный тип ошибки. Вот основные коды ошибок HTTP, которые важно знать:
Эти коды состояния сообщают, что запрос был получен и продолжается обработка.
Эти коды состояния указывают на успешное выполнение запроса.
Эти коды состояния указывают, что клиент должен предпринять дополнительные действия для завершения запроса.
Эти коды состояния указывают на ошибки, которые произошли по вине клиента.
Эти коды состояния указывают на ошибки, произошедшие на сервере.
Наиболее популярные коды ошибок HTTP включают:
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Anonymous Quiz
37%
is
38%
as
16%
cast
10%
typeof
Git — это система контроля версий, которая позволяет разработчикам отслеживать изменения в коде, сотрудничать с другими разработчиками, управлять версиями программного обеспечения и работать над проектами параллельно. Он стал стандартом в индустрии разработки программного обеспечения благодаря своим мощным возможностям и гибкости.
git log
git branch feature-branch
git checkout feature-branch
git merge main
git clone https://github.com/user/repo.git
git pull origin main
git push origin main
git remote add origin https://github.com/user/repo.git
git push -u origin main
git checkout <commit-hash>
git revert <commit-hash>
git init
git clone https://github.com/user/repo.git
git add .
git commit -m "Сообщение коммита"
git status
git log
git branch new-branch
git checkout new-branch
git merge new-branch
git push origin main
git pull origin main
Git нужен для отслеживания изменений в коде, управления версиями, сотрудничества между разработчиками и обеспечения резервного копирования проектов. Это мощная и гибкая система контроля версий, которая стала стандартом в разработке программного обеспечения.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍1