Dispose метод является частью паттерна управления ресурсами, известного как "Dispose Pattern". Этот метод реализуется в классах через интерфейс
IDisposable. Цель — явное освобождение неуправляемых ресурсов и, по желанию, управляемых ресурсов, прежде чем сборщик мусора освободит объект. Это важно для эффективного управления памятью и другими системными ресурсами.включают в себя ресурсы, которые не управляются средой CLR (Common Language Runtime), например, файловые дескрипторы, сетевые соединения или указатели на память, выделенную вне .NET среды.
это объекты .NET, которые занимают память и потенциально удерживают ссылки на неуправляемые ресурсы.
Должен освобождать все неуправляемые ресурсы, занимаемые объектом, а также должен иметь возможность освобождать управляемые ресурсы, если это необходимо. Как правило, управляемые ресурсы освобождаются сами сборщиком мусора, но если управляемый ресурс включает в себя неуправляемые ресурсы, тогда
Dispose может быть вызван для их явного освобождения.public class ResourceHolder : IDisposable
{
private bool disposed = false;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
// Освобождение управляемых ресурсов
}
// Освобождение неуправляемых ресурсов
disposed = true;
}
}
~ResourceHolder()
{
Dispose(false);
}
}
Пример использования Dispose
using (var resource = new ResourceHolder())
{
// Использование ресурса
}
// Метод Dispose автоматически вызывается при выходе из блока using
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥5
В JavaScript (как и в C#) сборщик мусора (Garbage Collector, GC) использует поколения (generational GC) для оптимизации работы с памятью. Это помогает быстрее и эффективнее очищать ненужные объекты, минимизируя задержки в работе программы.
В среднем, переменные и объекты в JS создаются и быстро перестают использоваться. Например, временные объекты в функциях.
Например, глобальные переменные, кэш данных или объекты в
setInterval. Проверять всю память каждый раз — дорого по времени. GC должен быстро убирать "мусор", не замедляя выполнение кода.
JS-движки, например V8 (Chrome, Node.js), используют Generational Garbage Collection — деление объектов на молодые (new generation) и старые (old generation).
Сюда попадают новые объекты.
GC часто проверяет эту область и быстро очищает.
Если объект "выжил" несколько проверок, он переносится в старшее поколение.
Здесь хранятся "долгоживущие" объекты.
Проверяется реже, так как здесь объекты реже становятся мусором.
Очистка более сложная и дорогая по времени.
Пример работы GC в V8
function createObjects() {
let obj1 = { name: "temp" }; // попадает в Young Generation
let obj2 = { data: new Array(1000).fill(0) }; // тоже в Young Generation
}
// После выхода из функции obj1 и obj2 становятся мусором и очищаются GC.Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4😁3🔥2
1. Упрощает выполнение CRUD-операций без написания SQL-запросов.
2. Примеры: Entity Framework, Hibernate, SQLAlchemy.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
При взаимодействии клиента и сервера используются различные*протоколы обмена данными, в зависимости от задачи, скорости, надежности и реального времени.
Клиент (браузер, мобильное приложение) делает запрос к серверу.
Сервер отправляет ответ с данными (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
👍8🔥1🎉1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
Многопоточное программирование позволяет улучшить производительность программ за счет параллельной обработки данных, но это также влечет за собой ряд специфических проблем. Понимание этих проблем и способы их предотвращения или управления ими критически важны для создания надежных и эффективных многопоточных приложений.
Проблема: Два или более потоков пытаются одновременно изменить общие данные или один поток читает данные во время их изменения другим потоком, что приводит к непредсказуемым результатам.
Решение: Использование механизмов синхронизации, таких как блокировки (locks), мьютексы (mutexes) и семафоры (semaphores), для контроля доступа к общим ресурсам.
Проблема: Два или более потоков бесконечно ожидают ресурсы, заблокированные друг другом, в результате чего они не могут продолжить выполнение.
Решение: Разработка программы таким образом, чтобы потоки запрашивали ресурсы всегда в одном и том же порядке, использование таймаутов для блокировок, чтобы потоки могли выйти из состояния ожидания.
Проблема: Один или несколько потоков не могут получить доступ к необходимым ресурсам, потому что другие потоки постоянно занимают их.
Решение: Применение справедливых блокировок (fair locks) или алгоритмов планирования, которые обеспечивают всем потокам равный доступ к ресурсам.
Проблема: Частое переключение контекста между потоками может значительно снизить производительность системы, особенно если потоки часто блокируются и разблокируются.
Решение: Оптимизация количества потоков, уменьшение зависимостей между потоками и уменьшение использования блокировок.
Проблема: Неправильное проектирование многопоточной архитектуры может привести к сложностям в поддержке и расширении программного обеспечения.
Решение: Использование абстракций высокого уровня для работы с потоками, таких как пулы потоков, параллельные библиотеки (например, TPL в .NET) и модели акторов.
private static readonly object _lock = new object();
private static int _sharedResource;
public static void UpdateResource()
{
lock (_lock)
{
_sharedResource++;
// Выполнение некоторой работы с общим ресурсом
}
}
Избегание взаимной блокировки
private static readonly object _lock1
= new object();
private static readonly object _lock2 = new object();
public static void Method1()
{
lock (_lock1)
{
// Некоторые действия
lock (_lock2)
{
// Дополнительные действия
}
}
}
public static void Method2()
{
lock (_lock1)
{
// Аналогичные действия
lock (_lock2)
{
// Дополнительные действия
}
}
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
Например, при создании объекта типа "Отчёт":
- У объекта много параметров (заголовок, дата, содержимое, автор, таблицы).
- С помощью билдера можно поочерёдно вызывать методы SetTitle(), SetContent(), SetFooter() и получить готовый объект методом Build().
Этот подход улучшает читаемость и гибкость кода.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Redis и Memcached являются популярными решениями для кэширования данных в памяти, что помогает ускорить доступ к данным и снизить нагрузку на базы данных в высоконагруженных системах. Обе системы часто используются для улучшения производительности веб-приложений и масштабируемых систем. Несмотря на общую цель, они имеют ряд различий в функциональности, производительности и подходах к управлению данными.
Redis поддерживает разнообразные типы данных, такие как строки, списки, множества, отсортированные множества, хеши и битовые карты. Это расширяет возможности использования Redis для различных сценариев, таких как реализация очередей, стеков, сложных структур данных и подсчёт уникальных элементов.
Memcached поддерживает только
Redis предлагает настраиваемые опции для долговременного хранения данных (персистентности), включая снимки состояния всей базы данных (snapshotting) и журналирование транзакций с предварительной записью (AOF, Append-Only File). Это позволяет восстанавливать состояние базы данных после перезагрузки системы.
Memcached не предлагает встроенных средств для персистентного хранения данных. По завершении работы процесса данные теряются, что делает его идеальным для временных и не очень важных данных, которые могут быть легко воссозданы или восстановлены.
Redis поддерживает различные модели распределения, включая шардинг (разделение данных на части по разным узлам) и репликацию. Это позволяет масштабировать Redis горизонтально и увеличивать его отказоустойчивость.
Memcached также поддерживает горизонтальное масштабирование и распределение данных с использованием простого алгоритма хэширования. Однако у него нет встроенной поддержки репликации или других продвинутых механизмов распределения, которые обеспечивают высокую доступность.
Redis предлагает дополнительные возможности, такие как выполнение Lua-скриптов на стороне сервера, что позволяет пользователям реализовывать сложную логику обработки данных непосредственно в Redis. Кроме того, Redis поддерживает публикацию и подписку на каналы событий.
Memcached имеет более ограниченный набор функций, сосредоточенных вокруг основной задачи кэширования, и не поддерживает скриптинг или публикацию/подписку.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🤔2👾2🔥1
- Inner Join: Объединяет только те строки, которые совпадают в обеих таблицах.
- Left Join: Возвращает все строки из левой таблицы и соответствующие строки из правой.
- Right Join: Аналогично Left Join, но для правой таблицы.
- Full Join: Возвращает все строки из обеих таблиц.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🎉2👀1💊1
В C# есть два способа выбросить исключение внутри блока
catch: 1.
throw; 2.
throw ex; Хотя они выглядят похоже, есть ключевое отличие в сохранении стека вызовов (stack trace).
Когда используется просто
throw;, исключение передаётся дальше без изменения информации о месте его возникновения. try
{
int x = 0;
int y = 5 / x; // Здесь возникнет DivideByZeroException
}
catch (Exception ex)
{
Console.WriteLine("Ошибка: " + ex.Message);
throw; // Исключение передаётся дальше без изменений
}
Когда используется
throw ex;, создаётся новая точка выброса исключения, и оригинальный стек вызовов теряется. try
{
int x = 0;
int y = 5 / x;
}
catch (Exception ex)
{
Console.WriteLine("Ошибка: " + ex.Message);
throw ex; // Оригинальный стек вызовов теряется
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👀5👍3🔥1
Forwarded from easyoffer
Я боялся, что провалю собеседование. Так появился easyoffer
Когда я только начинал искать первую работу программистом, меня пугала мысль, что я просто не смогу ответить на вопросы на собеседовании.
Типа… ты потратил месяцы на то, чтобы учиться, писал pet-проекты, собирал резюме, рассылаешь отклики — и всё может закончиться на одном-единственном вопросе, на который ты не знаешь ответ.
Я реально боялся.
Я смотрел видео mock-собеседований на YouTube, останавливал каждое, выписывал вопросы в Notion. Потом вручную писал к ним ответы. И потом ещё по нескольку раз перечитывал. Такой вот "тренажёр" на коленке.
📎 (там на картинке — один из моих реальных списков в Notion, ставь 🔥 если тоже так делал)
В какой-то момент я посчитал — у меня уже было выписано больше 500 вопросов. Я почувствовал ужас.
Потому что невозможно всё это зазубрить. А что, если спросят как раз тот, к которому я не успел подготовиться?..
Тогда и пришла идея
А что если понять, какие из вопросов встречаются чаще всего? Чтобы не учить всё подряд, а сфокусироваться на главном.
Так родился easyoffer.
Сначала — просто как пет-проект, чтобы показать в резюме и подготовиться к собесам. А потом оказалось, что он реально помогает людям. За первые месяцы его посетили сотни тысяч человек. И я понял: это больше, чем просто пет-проект.
Сейчас я делаю EasyOffer 2.0
И уже не один, а вместе с вами.
В новой версии будут:
– вопросы из реальных собесов, с фильтрацией по грейду, компании, типу интервью
– тренажёр с карточками (по принципу интервальных повторений — как в Anki)
– база задач с интервью
– тренажёр «реальное собеседование», чтобы отрепетировать как в жизни
Каждая фича упрощает и сокращает время на подготовку. Все эти штуки я бы мечтал иметь, когда сам готовился к собеседованиям.
Я делаю всё на свои деньги. Никаких инвесторов. Только вы и я.
Если вы хотите помочь — сейчас самое важное время.
Краудфандинг уже стартовал. Благодаря нему я смогу привлечь больше людей для разработки, сбору и обработки собеседований.
Все, кто поддержат проект до релиза, получат:
🚀 1 год PRO-доступа по цене месячной подписки. Его можно активировать в любое время, например когда начнете готовится к собесам.
➕ Доступ к закрытому бета-тесту
Поддержать 👉 https://planeta.ru/campaigns/easyoffer
Спасибо, что верите в этот проект 🙌
Когда я только начинал искать первую работу программистом, меня пугала мысль, что я просто не смогу ответить на вопросы на собеседовании.
Типа… ты потратил месяцы на то, чтобы учиться, писал pet-проекты, собирал резюме, рассылаешь отклики — и всё может закончиться на одном-единственном вопросе, на который ты не знаешь ответ.
Я реально боялся.
Я смотрел видео mock-собеседований на YouTube, останавливал каждое, выписывал вопросы в Notion. Потом вручную писал к ним ответы. И потом ещё по нескольку раз перечитывал. Такой вот "тренажёр" на коленке.
📎 (там на картинке — один из моих реальных списков в Notion, ставь 🔥 если тоже так делал)
В какой-то момент я посчитал — у меня уже было выписано больше 500 вопросов. Я почувствовал ужас.
Потому что невозможно всё это зазубрить. А что, если спросят как раз тот, к которому я не успел подготовиться?..
Тогда и пришла идея
А что если понять, какие из вопросов встречаются чаще всего? Чтобы не учить всё подряд, а сфокусироваться на главном.
Так родился easyoffer.
Сначала — просто как пет-проект, чтобы показать в резюме и подготовиться к собесам. А потом оказалось, что он реально помогает людям. За первые месяцы его посетили сотни тысяч человек. И я понял: это больше, чем просто пет-проект.
Сейчас я делаю EasyOffer 2.0
И уже не один, а вместе с вами.
В новой версии будут:
– вопросы из реальных собесов, с фильтрацией по грейду, компании, типу интервью
– тренажёр с карточками (по принципу интервальных повторений — как в Anki)
– база задач с интервью
– тренажёр «реальное собеседование», чтобы отрепетировать как в жизни
Каждая фича упрощает и сокращает время на подготовку. Все эти штуки я бы мечтал иметь, когда сам готовился к собеседованиям.
Я делаю всё на свои деньги. Никаких инвесторов. Только вы и я.
Если вы хотите помочь — сейчас самое важное время.
Краудфандинг уже стартовал. Благодаря нему я смогу привлечь больше людей для разработки, сбору и обработки собеседований.
Все, кто поддержат проект до релиза, получат:
🚀 1 год PRO-доступа по цене месячной подписки. Его можно активировать в любое время, например когда начнете готовится к собесам.
➕ Доступ к закрытому бета-тесту
Поддержать 👉 https://planeta.ru/campaigns/easyoffer
Спасибо, что верите в этот проект 🙌
❤3😁1
Тип string — это ссылочный тип. Однако, в отличие от других ссылочных типов, строки являются неизменяемыми (immutable). Это значит, что при любом изменении строки создаётся новый объект в памяти, а старый остаётся неизменным.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Позволяют определять конструкторы прямо в объявлении класса или структуры, что упрощает код и улучшает его читаемость.
public class Person(string name, int age)
{
public string Name { get; } = name;
public int Age { get; } = age;
}
Обеспечивает более удобный синтаксис для создания коллекций.
var numbers = [1, 2, 3, 4, 5];
Теперь можно задавать значения по умолчанию для auto-properties, что делает код более лаконичным.
public string Name { get; set; } = "Unknown";Позволяет использовать алиасы для пространств имен, улучшая читаемость кода.
using Text = System.Text;
Улучшены возможности для работы с лямбда-выражениями, делая их более гибкими и мощными.
Эти нововведения направлены на упрощение синтаксиса языка, улучшение читаемости и поддерживаемости кода, а также на повышение производительности и удобства разработки.
public class Program
{
public static void Main()
{
var person = new Person("John", 30);
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");
var numbers = [1, 2, 3, 4, 5];
numbers.ForEach(n => Console.WriteLine(n));
var name = new Name { Value = "Unknown" };
Console.WriteLine(name.Value);
}
}
public class Person(string name, int age)
{
public string Name { get; } = name;
public int Age { get; } = age;
}
public class Name
{
public string Value { get; set; } = "Default Name";
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🤔3👀2❤1🔥1
Строитель применяется, когда нужно пошагово создать сложный объект, избегая громоздкого конструктора с множеством параметров.
Он позволяет:
- Создавать разные представления одного и того же объекта.
- Разделить конструирование от представления.
- Собирать объект поэтапно и настраиваемо.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥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
👍1🤯1
Семафор — это ограничитель доступа, который позволяет нескольким потокам одновременно использовать ресурс, но только в пределах установленного количества. Например, если доступно 3 слота — максимум 3 потока могут работать параллельно, остальные ждут.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥1
"контекст синхронизации" (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
👍6🔥1