Используется для объявления небезопасного контекста кода, который позволяет выполнять низкоуровневые операции, такие как манипуляции с указателями. Эти операции обычно не разрешены в безопасном управляемом коде, но могут быть необходимы для взаимодействия с неуправляемым кодом, оптимизации производительности или доступа к определенным системным ресурсам.
Чтобы использовать указатели и выполнять небезопасные операции, нужно объявить метод, блок кода или тип как
unsafe. unsafe void UnsafeMethod()
{
int a = 10;
int* p = &a; // Использование указателя
Console.WriteLine(*p); // Разыменование указателя
}
Для компиляции кода с
unsafe необходимо включить поддержку небезопасного кода в настройках проекта. В Visual Studio это делается через свойства проекта:Указатели позволяют напрямую работать с адресами памяти, что может быть полезно для некоторых оптимизаций или взаимодействия с низкоуровневым кодом, написанным на C или C++.
unsafe void PointerExample()
{
int a = 5;
int* p = &a; // p указывает на адрес переменной a
Console.WriteLine((int)p); // Вывод адреса переменной a
Console.WriteLine(*p); // Вывод значения переменной a через указатель
}
Вы можете объявлять структуры с указателями и использовать их в небезопасном контексте.
unsafe struct UnsafeStruct
{
public int* Pointer;
}
stackalloc позволяет выделять память в стеке для массива в небезопасном контексте. Это может быть быстрее, чем выделение памяти в куче. unsafe void StackAllocExample()
{
int* array = stackalloc int[10]; // Выделение массива из 10 целых чисел в стеке
for (int i = 0; i < 10; i++)
{
array[i] = i;
}
}
Небезопасный код часто используется для взаимодействия с API, написанными на других языках, такими как C или C++.
[DllImport("user32.dll")]
extern static unsafe int MessageBox(IntPtr hWnd, char* text, char* caption, int options);
unsafe void CallUnmanagedCode()
{
char* text = "Hello, World!";
char* caption = "My Message Box";
MessageBox(IntPtr.Zero, text, caption, 0);
}Позволяет выполнять высокоэффективные операции с памятью.
Необходим для вызова функций из библиотек, написанных на других языках.
Предоставляет возможность прямого управления памятью и аппаратными ресурсами.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
throw используется для генерации исключения вручную или повторной генерации перехваченного.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊3👍1
Extension-методы (методы расширения) — это способ добавить новые методы к существующим классам, не изменяя их код и не создавая наследников. Они позволяют расширять классы и интерфейсы, даже если у нас нет доступа к их исходному коду.
Это обычные статические методы, но объявленные внутри статического класса.
Первый параметр метода должен принимать тот тип, который мы хотим расширить, и перед ним ставится ключевое слово
this. После этого метод становится доступен как "встроенный" у этого типа.
Допустим, у нас есть строка, и мы хотим добавить метод
ToSnakeCase, который заменяет пробелы на нижние подчеркивания. using System;
public static class StringExtensions
{
public static string ToSnakeCase(this string str)
{
return str.Replace(" ", "_").ToLower();
}
}
class Program
{
static void Main()
{
string text = "Hello World";
Console.WriteLine(text.ToSnakeCase()); // hello_world
}
}
Добавим метод `SumEvenNumbers()`, который суммирует только четные числа в
List<int>. using System;
using System.Collections.Generic;
using System.Linq;
public static class ListExtensions
{
public static int SumEvenNumbers(this List<int> numbers)
{
return numbers.Where(n => n % 2 == 0).Sum();
}
}
class Program
{
static void Main()
{
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6 };
Console.WriteLine(numbers.SumEvenNumbers()); // 12 (2 + 4 + 6)
}
}
Когда нужно добавить новый метод к существующему классу, но нельзя изменить его код (например,
string, List<T>, DateTime). Когда хочется сделать код более читаемым:
numbers.SumEvenNumbers() лучше, чем MyExtensions.SumEvenNumbers(numbers). Когда нужно улучшить API без наследования и изменения структуры классов.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
1. Создавать простые интерфейсы для сложных систем.
2. Сосредотачиваться на логике, а не на деталях реализации.
3. Обеспечивать полиморфизм и унифицированный подход к различным объектам.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
В ASP.NET Core методы Service Configuration используются для настройки и регистрации зависимостей в контейнере внедрения зависимостей (Dependency Injection, DI). Это позволяет управлять зависимостями в приложении, делая код более гибким, тестируемым и удобным для расширения.
Настройка сервисов выполняется в методе
ConfigureServices(IServiceCollection services), который находится в классе Program.cs или Startup.cs (в зависимости от версии .NET). public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(); // Добавление контроллеров для API
services.AddDbContext<ApplicationDbContext>(); // Регистрация контекста базы данных
services.AddScoped<IMyService, MyService>(); // Внедрение зависимости
}
создаёт единственный экземпляр объекта на всё время работы приложения.
services.AddSingleton<ILogger, ConsoleLogger>();
создаёт один экземпляр объекта на каждый HTTP-запрос.
services.AddScoped<IUserService, UserService>();
создаёт новый экземпляр объекта при каждом запросе.
services.AddTransient<IEmailSender, EmailSender>();
public class HomeController : Controller
{
private readonly IMyService _myService;
public HomeController(IMyService myService)
{
_myService = myService;
}
public IActionResult Index()
{
var data = _myService.GetData();
return View(data);
}
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊1
Асинхронность и многопоточность — разные концепции, но они могут пересекаться.
- Многопоточность — параллельное выполнение на нескольких потоках (обычно на разных ядрах процессора).
- Асинхронность — способ не блокировать поток при ожидании завершения операции (например, I/O), не обязательно создавая новый поток.
Асинхронные операции (async/await) чаще всего используют один поток, но освобождают его во время ожидания, позволяя выполнять другую работу.
Многопоточность полезна при расчётах, асинхронность — при ожидании (например, сетевых операций).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4
"контекст синхронизации" (SynchronizationContext) — это класс, который предоставляет возможность управлять способом, которым операции переключаются обратно в основной поток или контекст для продолжения выполнения после асинхронной операции. Это важно для приложений с графическим пользовательским интерфейсом, таких как Windows Forms и WPF, где доступ к элементам пользовательского интерфейса разрешён только из основного потока.
Абстрагирует модель синхронизации для различных сред выполнения. Например, в приложениях Windows Forms и WPF управление элементами UI должно происходить в главном потоке.
SynchronizationContext предоставляет методы для отправки (Send) и постановки (Post) задач, которые должны выполняться в правильном контексте.синхронно отправляет делегат на выполнение в контекст синхронизации.
асинхронно отправляет делегат на выполнение в контекст синхронизации.
Используется для того, чтобы после асинхронной операции вернуться в правильный поток и безопасно обновить UI или выполнить код, который требует выполнения в определённом потоке.
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
LoadDataAsync();
}
private async void LoadDataAsync()
{
string data = await GetDataAsync();
// Асинхронно получаем данные и обновляем UI
Dispatcher.Invoke(() => DisplayData(data));
}
private Task<string> GetDataAsync()
{
return Task.Run(() =>
{
// Имитация долгой операции
Thread.Sleep(5000);
return "Data loaded";
});
}
private void DisplayData(string data)
{
MyTextBox.Text = data;
}
}
Позволяет безопасно обращаться к элементам UI из асинхронных или вторичных потоков.
Обеспечивает выполнение кода в контексте, для которого он предназначен, что особенно важно в многопоточных и сетевых приложениях.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🤔1
Когда человек вводит логин и пароль, система аутентифицирует его, проверяя, действительно ли это тот, за кого он себя выдаёт.
Пользователь вводит данные (например, логин и пароль).
Система проверяет их в базе данных.
Если данные верны → доступ разрешён.
Если данные неверны → отказ в доступе.
public async Task<IActionResult> Login(string username, string password)
{
var user = await _userManager.FindByNameAsync(username);
if (user != null && await _userManager.CheckPasswordAsync(user, password))
{
await _signInManager.SignInAsync(user, isPersistent: false);
return RedirectToAction("Index", "Home");
}
ModelState.AddModelError("", "Неверный логин или пароль");
return View();
}
Самый распространённый вариант. Минус: если пароль украден – доступ открыт.
Например, SMS-код + пароль. Усложняет взлом аккаунта.
Отпечаток пальца, Face ID. Удобно, но требует спецоборудования.
Вход через соцсети. Удобно, не нужно запоминать пароль.
Используется в API и микросервисах. Позволяет работать без сохранения сессий.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊5🤔2
В C# абстрактные классы и интерфейсы используются для проектирования системы через наследование и полиморфизм, позволяя описывать общую функциональность, которую будут реализовывать конкретные классы. Однако у них есть свои особенности, ограничения и сферы применения.
Абстрактный класс — это класс, который не может быть создан напрямую (нельзя создать объект этого класса). Он может содержать как абстрактные методы (без реализации), так и методы с реализацией.
public abstract class Animal
{
public abstract void MakeSound(); // Абстрактный метод
public void Sleep() // Метод с реализацией
{
Console.WriteLine("Sleeping...");
}
}
Пример
public class Dog : Animal
{
public override void MakeSound()
{
Console.WriteLine("Bark!");
}
}
Использование
Animal myDog = new Dog();
myDog.MakeSound(); // Вывод: Bark!
myDog.Sleep(); // Вывод: Sleeping...
Интерфейс — это контракт, который определяет только сигнатуры методов, свойств, событий и индексаторов. Реализацию этих членов должен предоставить класс, который реализует интерфейс.
public interface IMovable
{
void Move();
int Speed { get; set; }
}
Пример
public class Car : IMovable
{
public int Speed { get; set; }
public void Move()
{
Console.WriteLine($"Moving at speed: {Speed}");
}
}
Использование
IMovable myCar = new Car { Speed = 60 };
myCar.Move(); // Вывод: Moving at speed: 60Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🤔2
Да:
- Ключ не должен быть null (в Dictionary).
- Ключ должен быть неизменяемым, т.е. после помещения в словарь не должен меняться его хеш или логическое состояние.
- Должен корректно реализовывать Equals() и GetHashCode(), иначе возможны ошибки поиска или дубликаты.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
Выбор между интерфейсом и абстрактным классом в C# зависит от нескольких факторов, таких как потребности в наследовании, степень общности, возможность множественного наследования и необходимость реализации по умолчанию.
Класс может реализовывать несколько интерфейсов, но наследоваться только от одного класса. Используйте интерфейсы, когда требуется множественное наследование.
public interface IDriveable
{
void Drive();
}
public interface IFlyable
{
void Fly();
}
public class FlyingCar : IDriveable, IFlyable
{
public void Drive() { /* Реализация вождения */ }
public void Fly() { /* Реализация полета */ }
}
Используйте интерфейсы, чтобы определить общий набор методов и свойств без предоставления какой-либо реализации. Это позволяет разным классам реализовать интерфейс по-своему.
public interface IShape
{
double GetArea();
}
public class Circle : IShape
{
public double Radius { get; set; }
public double GetArea() => Math.PI * Radius * Radius;
}
public class Rectangle : IShape
{
public double Width { get; set; }
public double Height { get; set; }
public double GetArea() => Width * Height;
}
Интерфейсы позволяют легко менять реализацию и обеспечивают гибкость в коде. Можно использовать интерфейсы для создания полиморфных коллекций или методов, которые работают с разными реализациями интерфейсов.
public void DrawShapes(IEnumerable<IShape> shapes)
{
foreach (var shape in shapes)
{
Console.WriteLine($"Area: {shape.GetArea()}");
}
}
Используйте абстрактные классы, если вы хотите предоставить некоторую общую реализацию, которую могут использовать подклассы. Абстрактные классы могут содержать как абстрактные, так и не абстрактные методы.
public abstract class Animal
{
public abstract void MakeSound();
public void Sleep() => Console.WriteLine("Sleeping");
}
public class Dog : Animal
{
public override void MakeSound() => Console.WriteLine("Bark");
}
Абстрактные классы хорошо подходят для реализации паттерна "Шаблонный метод", где общий алгоритм реализован в абстрактном классе, а конкретные шаги определены в подклассах.
public abstract class Game
{
public void Play()
{
Initialize();
StartPlay();
EndPlay();
}
protected abstract void Initialize();
protected abstract void StartPlay();
protected abstract void EndPlay();
}
public class Football : Game
{
protected override void Initialize() => Console.WriteLine("Football Game Initialized");
protected override void StartPlay() => Console.WriteLine("Football Game Started");
protected override void EndPlay() => Console.WriteLine("Football Game Ended");
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Это система, реализующая архитектурный стиль REST (Representational State Transfer). Это означает:
- Используются HTTP-методы как команды (GET, POST, PUT, DELETE).
- Ресурсы имеют уникальные URI.
- Коммуникация без состояния (stateless).
- Возможна кэшируемость.
- Данные передаются в виде представлений ресурса (обычно JSON/XML).ксте онлайн
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
При взаимодействии клиента и сервера используются различные*протоколы обмена данными, в зависимости от задачи, скорости, надежности и реального времени.
Клиент (браузер, мобильное приложение) делает запрос к серверу.
Сервер отправляет ответ с данными (HTML, JSON, XML).
Использует методы:
GET, POST, PUT, DELETE и т. д. fetch('https://api.example.com/data')
.then(response => response.json())
.then(data => console.log(data));Клиент устанавливает постоянное соединение с сервером.
Сервер и клиент могут отправлять друг другу данные в любое время.
Используется для чата, онлайн-игр, бирж, обновлений в реальном времени.
const socket = new WebSocket('wss://example.com/socket');
socket.onopen = () => socket.send('Привет, сервер!');
socket.onmessage = event => console.log('Сообщение от сервера:', event.data);Клиент делает HTTP-запрос, но соединение не закрывается.
Сервер постепенно отправляет данные в виде событий (
event-stream). Используется для новостей, биржевых данных, уведомлений.
const eventSource = new EventSource('/events');
eventSource.onmessage = event => console.log('Новое сообщение:', event.data);Клиент вызывает удаленные методы напрямую как обычные функции.
Работает на HTTP/2, использует бинарный формат Protocol Buffers (быстрее, чем JSON).
Используется для высокопроизводительных API, микросервисов.
import grpc
import my_service_pb2
import my_service_pb2_grpc
channel = grpc.insecure_channel('localhost:50051')
stub = my_service_pb2_grpc.MyServiceStub(channel)
response = stub.MyMethod(my_service_pb2.MyRequest(name="Alice"))
print(response.message)
Работает по модели издатель/подписчик.
Клиент подписывается на тему (topic) и получает сообщения, когда кто-то публикует данные.
Используется для умных устройств, датчиков, IoT.
const mqtt = require('mqtt');
const client = mqtt.connect('mqtt://broker.hivemq.com');
client.on('connect', () => {
client.subscribe('myTopic');
client.publish('myTopic', 'Привет, MQTT!');
});
client.on('message', (topic, message) => {
console.log(`Сообщение из ${topic}: ${message.toString()}`);
});Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6💊1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4💊2
CancellationToken в C# используется для координации отмены между потоками. Это механизм, позволяющий запрашивать отмену операции (например, задачи Task или асинхронного метода), не прерывая поток принудительно.В многопоточных или асинхронных операциях бывает необходимо отменить выполнение кода, например:
Пользователь отменил загрузку файла.
Истек тайм-аут выполнения операции.
Нужно прервать выполнение нескольких связанных задач.
Источник токена (
CancellationTokenSource) управляет токеном (CancellationToken), который передаётся в задачи.Код регулярно проверяет
cancellationToken.IsCancellationRequested, чтобы определить, нужно ли остановиться.Если вызывается
cts.Cancel(), все методы, использующие этот токен, получают сигнал об отмене.using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
using var cts = new CancellationTokenSource();
// Отменяем операцию через 3 секунды
cts.CancelAfter(3000);
try
{
await DoWorkAsync(cts.Token);
}
catch (OperationCanceledException)
{
Console.WriteLine("Операция отменена!");
}
}
static async Task DoWorkAsync(CancellationToken cancellationToken)
{
for (int i = 0; i < 10; i++)
{
cancellationToken.ThrowIfCancellationRequested(); // Проверка отмены
Console.WriteLine($"Работаем... {i}");
await Task.Delay(1000, cancellationToken); // Ожидание с проверкой отмены
}
}
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
1. Запросы начинают блокироваться, вызывая задержки.
2. Сервер может возвращать ошибки подключения.
3. Производительность приложения резко снижается. Решение: увеличить лимит подключений или оптимизировать запросы.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
lock используется для управления доступом к ресурсам в многопоточных приложениях. Это предотвращает возникновение проблем, связанных с одновременным доступом нескольких потоков к одному и тому же ресурсу, что может привести к непредсказуемому поведению или коррупции данных.
Принимает в качестве параметра объект, который используется в качестве мьютекса (взаимоисключающего объекта). Во время выполнения блока кода внутри
lock, текущий поток "захватывает" мьютекс. Если другой поток попытается войти в заблокированный участок кода, используя тот же мьютекс, он будет приостановлен до тех пор, пока первый поток не завершит выполнение блока lock и не освободит мьютекс.public class Account
{
private decimal balance;
private readonly object balanceLock = new object();
public void Deposit(decimal amount)
{
lock (balanceLock)
{
balance += amount;
}
}
public void Withdraw(decimal amount)
{
lock (balanceLock)
{
if (balance >= amount)
{
balance -= amount;
}
}
}
}
Без использования
lock или других методов синхронизации, программы с многопоточным доступом к общим данным могут испытывать проблемы, такие как гонки и условия гонки (race conditions), когда порядок или время доступа к данным может привести к ошибкам или неожиданным результатам. lock гарантирует, что только один поток может исполнять определенный блок кода, работающий с критическими ресурсами, в любой момент времени.Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🔥1🤔1
1. GET: данные передаются в URL как параметры.
2. POST: данные передаются в теле запроса.
3. PUT и PATCH: обновляют данные, передавая их в теле запроса.
4. DELETE: удаляет ресурс, данные могут передаваться в URL или теле.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM