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
Anonymous Quiz
14%
StringBuilder
13%
Array
70%
String
3%
List<T>
Обмен изменениями в базе данных в контексте контроля версий может быть сложным, поскольку базы данных не являются простыми текстовыми файлами и требуют особого подхода для синхронизации изменений. Вот несколько подходов и инструментов, которые можно использовать для управления версиями базы данных и обмена изменениями:
// Пример миграции с использованием Entity Framework
public partial class AddNewTable : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "NewTable",
columns: table => new
{
Id = table.Column<int>(nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
Name = table.Column<string>(nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_NewTable", x => x.Id);
});
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(name: "NewTable");
}
}
-- Пример SQL-скрипта для добавления нового столбца в таблицу
ALTER TABLE Users ADD BirthDate DATE;
dotnet ef migrations add AddNewTable
dotnet ef database update
flyway migrate
liquibase update
Для обмена изменениями в базе данных используется подход с миграциями, который позволяет управлять изменениями схемы базы данных. Инструменты, такие как Entity Framework Migrations, Flyway и Liquibase, помогают автоматизировать и управлять этим процессом. Миграции и скрипты изменений хранятся в системе контроля версий и применяются последовательно для синхронизации баз данных.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤1
Anonymous Quiz
18%
ToList()
22%
FirstOrDefault()
53%
Where()
7%
Count()
В C#
partial классы позволяют определять один и тот же класс, структуру или интерфейс в нескольких файлах. Это удобно для организации кода, особенно при работе с автоматически генерируемыми файлами или при совместной работе нескольких разработчиков над одним классом.public partial class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public void PrintFullName()
{
Console.WriteLine($"{FirstName} {LastName}");
}
}
public partial class Person
{
public int Age { get; set; }
public void PrintAge()
{
Console.WriteLine($"Age: {Age}");
}
}
Person определен в двух отдельных файлах с помощью ключевого слова partial.Person в один класс. В результате, объект Person имеет все свойства и методы, определенные в обоих файлах.class Program
{
static void Main(string[] args)
{
Person person = new Person
{
FirstName = "John",
LastName = "Doe",
Age = 30
};
person.PrintFullName(); // Выведет: John Doe
person.PrintAge(); // Выведет: Age: 30
}
}
partial класса должны быть определены в одном и том же сборочном проекте.partial класса.Partial классы в C# позволяют разделять определение одного класса на несколько файлов. Это удобно для организации кода, совместной разработки и интеграции с инструментами, генерирующими код. Компилятор объединяет все части класса в один, что позволяет работать с ним как с обычным классом.Please open Telegram to view this post
VIEW IN TELEGRAM
👍4