В 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
❤1
Anonymous Quiz
65%
int.Parse()
12%
Convert.ToString()
4%
String.Convert()
20%
ToInt32()
Исключения в программировании — это механизмы обработки ошибок и необычных ситуаций, которые возникают во время выполнения программы. В C# и других языках программирования исключения позволяют отделить код обработки ошибок от основного кода программы, что упрощает его чтение и поддержку.
try
{
// Код, который может вызвать исключение
int divisor = 0;
int result = 10 / divisor;
}
catch (DivideByZeroException ex)
{
// Обработка исключения
Console.WriteLine("Деление на ноль невозможно.");
}
finally
{
// Код, который выполнится в любом случае
Console.WriteLine("Блок finally выполнен.");
}
public class InvalidAgeException : Exception
{
public InvalidAgeException(string message) : base(message) { }
}
public void SetAge(int age)
{
if (age < 0)
{
throw new InvalidAgeException("Возраст не может быть отрицательным.");
}
// Логика установки возраста
}
Исключения — это механизм обработки ошибок в C#, позволяющий отделить код обработки ошибок от основного кода программы. Основные элементы включают блоки
try, catch, finally, а также оператор throw для явного вызова исключений.Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Anonymous Quiz
22%
Метод вернет true, если данные равны
43%
Метод всегда вернет false
9%
Метод вызовет исключение
27%
Метод вернет true, если объекты идентичны
🤯12😁6🎉2
Параллелизм в программировании — это метод выполнения нескольких операций одновременно, что позволяет ускорить выполнение задач и эффективно использовать ресурсы компьютера, такие как многоядерные процессоры. Параллелизм отличается от многозадачности тем, что он предполагает одновременное выполнение задач, а не просто чередование выполнения.
using System;
using System.Threading.Tasks;
class Program
{
static void Main()
{
Parallel.For(0, 10, i =>
{
Console.WriteLine($"Task {i} is running on thread {Task.CurrentId}");
});
}
}
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
var task1 = Task.Run(() => DoWork("Task 1"));
var task2 = Task.Run(() => DoWork("Task 2"));
await Task.WhenAll(task1, task2);
}
static void DoWork(string taskName)
{
Console.WriteLine($"{taskName} is running on thread {Task.CurrentId}");
}
}
Task) и параллельным выполнением.Параллелизм — это метод одновременного выполнения нескольких задач для ускорения процессов и эффективного использования ресурсов компьютера. В C# это реализуется через
Parallel и Task классы, позволяя выполнять задачи на разных процессорных ядрах одновременно.Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Anonymous Quiz
13%
По расписанию
62%
Когда ссылки на объект обнуляются
22%
Когда объект недоступен и использует алгоритмы
3%
По ручной пометке
🤯23😁3
Асинхронное программирование — это метод программирования, при котором выполнение задач не блокирует основной поток приложения. Это позволяет улучшить производительность и отзывчивость приложений, особенно при выполнении длительных операций, таких как ввод-вывод (I/O), сетевые запросы или взаимодействие с базами данных.
async и await в C#.Task представляет собой операцию, которая может выполняться асинхронно.using System;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
string url = "https://api.example.com/data";
string result = await FetchDataAsync(url);
Console.WriteLine(result);
}
static async Task<string> FetchDataAsync(string url)
{
using (HttpClient client = new HttpClient())
{
HttpResponseMessage response = await client.GetAsync(url);
response.EnsureSuccessStatusCode();
string responseBody = await response.Content.ReadAsStringAsync();
return responseBody;
}
}
}
Main и FetchDataAsync объявлены с async.FetchDataAsync await используется для ожидания завершения операций GetAsync и ReadAsStringAsync.FetchDataAsync, представляющий асинхронную операцию, которая возвращает строку.static async Task Main(string[] args)
{
await Task.Run(() => DoWork());
}
static void DoWork()
{
// Выполнение длительной операции
Console.WriteLine("Работа выполнена.");
}
using System;
using System.IO;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
string filePath = "example.txt";
string content = await ReadFileAsync(filePath);
Console.WriteLine(content);
}
static async Task<string> ReadFileAsync(string filePath)
{
using (StreamReader reader = new StreamReader(filePath))
{
return await reader.ReadToEndAsync();
}
}
}
Асинхронное программирование позволяет выполнять длительные операции без блокировки основного потока, улучшая производительность и отзывчивость приложений. В C# это реализуется с использованием ключевых слов
async и await, а также класса Task.Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
Паттерны проектирования (или шаблоны проектирования) — это проверенные решения общих проблем, которые возникают при разработке программного обеспечения. Они представляют собой шаблоны для организации кода, которые улучшают его структуру, читаемость и повторное использование. Паттерны проектирования не являются готовым кодом, но они предлагают структуры и подходы, которые можно адаптировать к конкретным потребностям проекта.
Обеспечивает создание единственного экземпляра класса и предоставляет глобальную точку доступа к этому экземпляру.
public class Singleton
{
private static Singleton instance;
private Singleton() { }
public static Singleton Instance
{
get
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}
Определяет интерфейс для создания объекта, но позволяет подклассам изменить тип создаваемого объекта.
public abstract class Product { }
public class ConcreteProductA : Product { }
public class ConcreteProductB : Product { }
public abstract class Creator
{
public abstract Product FactoryMethod();
}
public class ConcreteCreatorA : Creator
{
public override Product FactoryMethod()
{
return new ConcreteProductA();
}
}
public class ConcreteCreatorB : Creator
{
public override Product FactoryMethod()
{
return new ConcreteProductB();
}
}Позволяет объектам с несовместимыми интерфейсами работать вместе.
public interface ITarget
{
void Request();
}
public class Adaptee
{
public void SpecificRequest()
{
Console.WriteLine("Specific request");
}
}
public class Adapter : ITarget
{
private readonly Adaptee _adaptee;
public Adapter(Adaptee adaptee)
{
_adaptee = adaptee;
}
public void Request()
{
_adaptee.SpecificRequest();
}
}
Определяет зависимость "один ко многим" между объектами таким образом, что при изменении состояния одного объекта все зависимые объекты оповещаются и обновляются автоматически.
public interface IObserver
{
void Update();
}
public class ConcreteObserver : IObserver
{
public void Update()
{
Console.WriteLine("Observer updated");
}
}
public class Subject
{
private readonly List<IObserver> observers = new List<IObserver>();
public void Attach(IObserver observer)
{
observers.Add(observer);
}
public void Detach(IObserver observer)
{
observers.Remove(observer);
}
public void Notify()
{
foreach (var observer in observers)
{
observer.Update();
}
}
}
Паттерны проектирования — это проверенные решения общих проблем в разработке программного обеспечения. Они делятся на три категории: порождающие (Singleton, Factory Method), структурные (Adapter, Composite) и поведенческие (Observer, Strategy). Использование паттернов улучшает структуру кода, делает его более читаемым и гибким.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3😁1
Anonymous Quiz
81%
Action, Func, Predicate.
5%
List, Array, Dictionary.
9%
Event, Property, Method.
5%
Static, Virtual, Override.
Паттерны проектирования — это шаблоны для решения общих проблем при разработке ПО. Они делятся на три категории:
Паттерны проектирования (порождающие, структурные, поведенческие) — это шаблоны для решения типовых задач в разработке ПО, улучшающие структуру и гибкость кода.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Anonymous Quiz
48%
Использовать generics.
10%
Использовать boxing.
13%
Использовать массивы.
29%
Использовать структуры.
🤯3
Монолитная и микросервисная архитектуры представляют собой два разных подхода к построению программных систем. Рассмотрим ключевые отличия между ними на практике:
Определение:
Монолитная архитектура представляет собой единое, цельное приложение, в котором все компоненты и модули тесно связаны друг с другом.
Особенности:
Определение:
Микросервисная архитектура разделяет приложение на множество небольших, независимых сервисов, каждый из которых выполняет свою конкретную задачу.
Особенности:
Монолит:
Предположим, у вас есть интернет-магазин. В монолитной архитектуре все функции, такие как каталог товаров, корзина, заказы, учетные записи пользователей и платежи, находятся в одном приложении. Обновление логики корзины требует развертывания всего приложения заново.
Микросервисы:
В микросервисной архитектуре каждый компонент интернет-магазина становится отдельным сервисом. Есть отдельные сервисы для каталога товаров, корзины, заказов, учетных записей пользователей и платежей. Если нужно обновить логику корзины, вы можете развернуть только соответствующий сервис, не затрагивая остальные.
Монолитная архитектура объединяет все компоненты приложения в одном проекте, что упрощает разработку и деплой, но усложняет масштабирование и поддержку. Микросервисная архитектура разделяет приложение на независимые сервисы, что улучшает масштабируемость и модульность, но усложняет координацию и тестирование.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2😁1
Anonymous Quiz
4%
Использовать команды для переноса данных вручную.
14%
Использовать SQL скрипты.
78%
Использовать систему миграций.
4%
Использовать внешние ключи.
СиШарпСНуляДоПрофи.docx
88.2 MB
Парень написал обширное руководство по C# в виде формата Word, которое охватывает все основные концепции языка С# включая парадигму ООП.
Руководство еще подлежит коррективам но вы сможете уже его использовать для обучения/ознакомления и зафиксировать основные моменты. Сам документ прикреплен ниже. Выглядит очень информативно 👍
Можете оставить фидбек в коментах, ну либо кто хочет помочь совместно закончить реализацию напишите ему: https://t.iss.one/vlar4x
Руководство еще подлежит коррективам но вы сможете уже его использовать для обучения/ознакомления и зафиксировать основные моменты. Сам документ прикреплен ниже. Выглядит очень информативно 👍
Можете оставить фидбек в коментах, ну либо кто хочет помочь совместно закончить реализацию напишите ему: https://t.iss.one/vlar4x
🔥8
Внешние ключи в базе данных играют важную роль в обеспечении целостности данных и установлении связей между таблицами. Они представляют собой специальные столбцы или группы столбцов в одной таблице, которые ссылаются на первичный ключ другой таблицы. Рассмотрим подробнее, почему внешние ключи важны и как они должны использоваться.
Orders и таблица Customers, внешний ключ в Orders может ссылаться на первичный ключ в Customers, гарантируя, что каждый заказ относится к существующему клиенту.Orders, если нет соответствующего клиента в таблице Customers.ALTER TABLE.CREATE TABLE Orders (
OrderID int PRIMARY KEY,
OrderDate datetime,
CustomerID int,
FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
);
ALTER TABLE.ALTER TABLE Orders
ADD CONSTRAINT FK_CustomerOrder
FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID);
CREATE TABLE Orders (
OrderID int PRIMARY KEY,
OrderDate datetime,
CustomerID int,
FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
ON DELETE CASCADE
);
CREATE TABLE Customers (
CustomerID int PRIMARY KEY,
CustomerName varchar(255)
);
CREATE TABLE Orders (
OrderID int PRIMARY KEY,
OrderDate datetime,
CustomerID int,
FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
);
CREATE TABLE Orders (
OrderID int PRIMARY KEY,
OrderDate datetime,
CustomerID int,
FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
ON DELETE CASCADE
);
Внешние ключи должны быть в базе данных для поддержания целостности данных, установления связей между таблицами и упрощения запросов. Они предотвращают некорректные данные и обеспечивают правильные каскадные операции при обновлениях и удалениях.
Please open Telegram to view this post
VIEW IN TELEGRAM
Anonymous Quiz
91%
DbContext, DbSet, LINQ to Entities.
5%
DataTable, DataSet, DataRow.
2%
Collection, List, Array.
2%
Index, Key, Value.
🤯2
Покрытие кода контроллера тестами является важной практикой, которая помогает повысить качество и надежность приложения. Рассмотрим, что это означает, зачем это нужно, и как это делается.
Тесты для контроллеров — это автоматические тесты, которые проверяют функциональность методов контроллеров в веб-приложениях. Эти тесты могут быть двух основных типов:
Модульные тесты контроллеров проверяют методы контроллера изолированно. Для этого обычно используются моки или заглушки для зависимостей контроллера, таких как сервисы или репозитории.
Пример модульного теста контроллера с использованием библиотеки xUnit и Moq:
using Moq;
using Xunit;
using MyWebApp.Controllers;
using MyWebApp.Services;
using Microsoft.AspNetCore.Mvc;
public class MyControllerTests
{
[Fact]
public void Get_ReturnsOkResult_WithListOfItems()
{
// Arrange
var mockService = new Mock<IMyService>();
mockService.Setup(service => service.GetItems()).Returns(new List<string> { "Item1", "Item2" });
var controller = new MyController(mockService.Object);
// Act
var result = controller.Get();
// Assert
var okResult = Assert.IsType<OkObjectResult>(result);
var items = Assert.IsType<List<string>>(okResult.Value);
Assert.Equal(2, items.Count);
}
}
Интеграционные тесты проверяют взаимодействие контроллера с другими компонентами системы. Обычно для таких тестов используется реальная база данных или её тестовый аналог.
Пример интеграционного теста с использованием xUnit и TestServer из Microsoft.AspNetCore.TestHost:
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.Testing;
using Xunit;
public class MyControllerIntegrationTests : IClassFixture<WebApplicationFactory<MyWebApp.Startup>>
{
private readonly HttpClient _client;
public MyControllerIntegrationTests(WebApplicationFactory<MyWebApp.Startup> factory)
{
_client = factory.CreateClient();
}
[Fact]
public async Task Get_ReturnsOkResult_WithListOfItems()
{
// Act
var response = await _client.GetAsync("/api/my");
// Assert
response.EnsureSuccessStatusCode();
var responseString = await response.Content.ReadAsStringAsync();
Assert.Contains("Item1", responseString);
}
}
Покрытие кода контроллера тестами помогает обнаруживать ошибки, поддерживать корректность кода, облегчает рефакторинг и улучшает архитектуру приложения. Модульные тесты проверяют методы изолированно, а интеграционные тесты проверяют их взаимодействие с другими компонентами.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Anonymous Quiz
82%
List, Dictionary, Queue, Stack.
11%
Array, Hashtable, SortedList, LinkedList.
7%
Collection, Set, Map, Queue.
1%
Tree, Graph, Map, Set.
😁5
В трехслойной архитектуре (трехуровневая архитектура), также известной как многоуровневая архитектура, приложения разделяются на три логических слоя:
REST (Representational State Transfer):
С точки зрения трехслойной архитектуры:
SWAP (Simple Web API):
С точки зрения трехслойной архитектуры:
В трехслойной архитектуре REST и SWAP выступают как интерфейсы, обеспечивающие взаимодействие между слоями, при этом они сами чаще всего принадлежат к логическому слою, поскольку реализуют бизнес-логику и правила приложения, обеспечивая доступ к данным через слой данных и предоставляя функционал презентационному слою.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Anonymous Quiz
98%
async, await.
1%
parallel, concurrent.
0%
thread, lock.
1%
task, event.
🤯4