Библиотека шарписта | C#, F#, .NET, ASP.NET
Все самое полезное для C#-разработчика в одном канале. Наши курсы: https://clc.to/y3LDtw По рекламе: @tproger_sales_bot Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead
Ko'proq ko'rsatish📈 Telegram kanali Библиотека шарписта | C#, F#, .NET, ASP.NET analitikasi
Библиотека шарписта | C#, F#, .NET, ASP.NET (@csharpproglib) Rus til segmentidagi kanali faol ishtirokchi. Hozirda hamjamiyat 21 538 obunachidan iborat bo'lib, Texnologiyalar & Aralashmalar toifasida 6 161-o'rinni va Rossiya mintaqasida 30 446-o'rinni egallagan.
📊 Auditoriya ko‘rsatkichlari va dinamika
невідомо sanasidan buyon loyiha tez o‘sib, 21 538 obunachiga ega bo‘ldi.
29 Oktabr, 2026 dagi oxirgi ma’lumotlarga ko‘ra kanal barqaror faollikka ega. Oxirgi 30 kunda obunachilar soni -114 ga, so‘nggi 24 soatda esa -12 ga o‘zgardi va umumiy qamrov yuqori darajada qolmoqda.
- Tasdiqlash holati: Tasdiqlanmagan
- Jalb etish (ER): Auditoriya o‘rtacha 15.81% darajada jalb etiladi. Nashrdan keyingi dastlabki 24 soatda kontent odatda umumiy obunachilar sonining 7.41% ini tashkil etuvchi reaksiyalarni to‘playdi.
- Post qamrovi: Har bir post o‘rtacha 3 406 marta ko‘riladi; birinchi sutkada odatda 1 597 ta ko‘rish yig‘iladi.
- Reaksiyalar va o‘zaro ta’sir: Auditoriya faol: har bir postga o‘rtacha 4 ta reaksiya keladi.
- Tematik yo‘nalishlar: Kontent .net, шарписта, навигация, await, string kabi asosiy mavzularga jamlangan.
📝 Tavsif va kontent siyosati
Muallif resursni shaxsiy fikrni ifoda etish maydoni sifatida ta’riflaydi:
“Все самое полезное для C#-разработчика в одном канале.
Наши курсы: https://clc.to/y3LDtw
По рекламе: @tproger_sales_bot
Для обратной связи: @proglibrary_feeedback_bot
РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead”
Yuqori yangilanish chastotasi (oxirgi ma’lumot 30 Oktabr, 2026 da olingan) sababli kanal doimo dolzarb va katta qamrovli bo‘lib qoladi. Analitika auditoriya kontent bilan faol hamkorlik qilishini, uni Texnologiyalar & Aralashmalar toifasidagi muhim ta’sir nuqtasiga aylantirishini ko‘rsatadi.
public record Point(int X, int Y);
var point = new Point(15, 20);
int x = point.X;
int y = point.Y;
Просто распакуйте:
var (x, y) = new Point(15, 20);
Console.WriteLine($"Координаты: {x}, {y}");
Это особенно удобно в сочетании с pattern matching и switch выражениями:
public record User(string Name, int Age);
if (new User("Боб", 25) is { Age: > 18 })
Console.WriteLine("Взрослый пользователь");
var (name, age) = new User("Алиса", 30);
Вместо трёх строк получаете одну строку и респект от коллег не факт.
🐸Библиотека шарписта
#sharp_viewpublic record Person(string FirstName, string LastName);
var original = new Person("Анна", "Смирнова");
var updated = original with { LastName = "Петрова" };
Console.WriteLine(original.LastName); // Смирнова
Console.WriteLine(updated.LastName); // Петрова
Особенно полезно в event sourcing, CQRS или Redux-подобных архитектурах, где вы дериватизируете новые состояния без мутации исходных данных:
public record Order(int Id, string Status);
var first = new Order(1, "Ожидает");
var second = first with { Status = "Обработан" };
var third = second with { Status = "Отправлен" };
// Все три состояния существуют независимо
Это гарантирует, что никаких побочных эффектов, никаких неожиданных изменений в другой части кода. История состояний становится явной.
🐸Библиотека шарписта
#sharp_viewpublic record Person(string FirstName, string LastName);
var p1 = new Person("Иван", "Иванов");
var p2 = new Person("Иван", "Иванов");
Console.WriteLine(p1 == p2); // true
Без переопределения Equals, без GetHashCode, без перегрузки оператора ==. Record сам сравнит все свойства и даст правильный результат.
В словарях, в списках, при проверке условий — везде это работает как вы интуитивно ожидаете. Не будет случайных багов, когда один экземпляр не равен другому из-за того, что вы забыли переопределить Equals.
var users = new HashSet<User>();
users.Add(new User("Мария", "maria@example.com"));
users.Contains(new User("Мария", "maria@example.com")); // true — работает!
Value-based семантика — это основа, на которой строятся остальные возможности Records.
🐸Библиотека шарписта
#sharp_viewpublic record User(string Name, string Email);
var user = new User("Алексей", "alex@example.com");
// user.Name = "Новое имя"; — Ошибка компиляции
Все свойства автоматически получают init-accessor. Установить значение можно только при создании объекта. Это не просто синтаксический сахар — это гарантия от багов состояния, которые трудно найти.
Если вам нужен объект инициализатор, Records это поддерживают:
public record Product
{
public string Name { get; init; }
public decimal Price { get; init; }
}
var book = new Product { Name = "C# Deep Dive", Price = 49.99M };
Проще тестировать, проще рассуждать о коде, проще избежать багов в многопоточной среде. А ошибки, связанные с неожиданным изменением состояния, просто перестают существовать.
🐸Библиотека шарписта
#sharp_viewforeach не всегда оптимален.
Почему лучше избегать foreach:
• foreach использует итератор — для массивов его оптимизируют, но для списков, словарей и других коллекций создаётся объект или struct-итератор.
• под капотом foreach может создавать временные объекты, что увеличивает нагрузку на сборщик мусора и снижает производительность.
• foreach всегда выполняет проверки и гарантирует корректность обхода, но это стоит некоторой производительности.
Что использовать вместо foreach:
Цикл for с индексом, особенно для массивов:
for (int i = 0; i < data.Length; i++)
{
// работа с data[i]
}
Span<T> и его методы — для обхода данных без выделения памяти и избыточных проверок:
var span = data.AsSpan();
for (int i = 0; i < span.Length; i++)
{
// работа с span[i]
}
Когда можно использовать foreach:
• Если цикл выполняется нечасто или количество элементов небольшое.
• Для обхода коллекций, где критичен чистый и понятный стиль программирования.
🐸Библиотека шарписта
#sharp_viewpublic class MyService
{
private readonly MySettings _settings;
public MyService(IOptions<MySettings> options)
{
_settings = options.Value;
}
public void PrintSettings()
{
Console.WriteLine($"API Key: {_settings.ApiKey}");
}
}
Это подходит для статичных настроек, которые не меняются во время работы приложения.
IOptionsSnapshot — создаётся на каждый запрос или скоуп и предоставляет новые значения при каждом новом запросе:
public class MyScopedService
{
private readonly MySettings _settings;
public MyScopedService(IOptionsSnapshot<MySettings> options)
{
_settings = options.Value;
}
public void PrintSettings()
{
Console.WriteLine($"Timeout: {_settings.Timeout}");
}
}
Подходит для веб-приложений, где конфигурация может меняться между запросами.
IOptionsMonitor — позволяет подписаться на изменения и получать обновления конфигурации в реальном времени:
public class MyMonitorService
{
private MySettings _settings;
public MyMonitorService(IOptionsMonitor<MySettings> monitor)
{
_settings = monitor.CurrentValue;
monitor.OnChange(updatedSettings =>
{
_settings = updatedSettings;
Console.WriteLine("Settings updated!");
});
}
public void PrintSettings()
{
Console.WriteLine($"LogLevel: {_settings.LogLevel}");
}
}
Подходит для длительно работающих приложений, которые должны реагировать на изменения конфигурации без перезапуска.
🐸Библиотека шарписта
#sharp_view