Библиотека шарписта | C#, F#, .NET, ASP.NET
Все самое полезное для C#-разработчика в одном канале. Наши курсы: https://clc.to/y3LDtw По рекламе: @proglib_adv Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead
إظهار المزيد📈 نظرة تحليلية على قناة تيليجرام Библиотека шарписта | C#, F#, .NET, ASP.NET
تُعد قناة Библиотека шарписта | C#, F#, .NET, ASP.NET (@csharpproglib) في القطاع اللغوي الروسية لاعباً نشطاً. يضم المجتمع حالياً 21 701 مشتركاً، محتلاً المرتبة 5 943 في فئة التكنولوجيات والتطبيقات والمرتبة 30 267 في منطقة روسيا.
📊 مؤشرات الجمهور والحراك
منذ تأسيسه في невідомо، حقق المشروع نمواً سريعاً وجمع 21 701 مشتركاً.
بحسب آخر البيانات بتاريخ 29 أغسطس, 2026، تحافظ القناة على نشاط مستقر. خلال آخر 30 يوماً تغيّر عدد الأعضاء بمقدار -48، وفي آخر 24 ساعة بمقدار -6، مع بقاء الوصول العام مرتفعاً.
- حالة التحقق: غير موثّقة
- معدل التفاعل (ER): يبلغ متوسط تفاعل الجمهور 16.72%. وخلال أول 24 ساعة من النشر يحصد المحتوى عادةً 7.84% من ردود الفعل نسبةً إلى إجمالي المشتركين.
- وصول المنشورات: يحصل كل منشور على متوسط 3 628 مشاهدة. وخلال اليوم الأول يجمع عادةً 1 702 مشاهدة.
- التفاعلات والاستجابة: يتفاعل الجمهور بانتظام؛ متوسط التفاعلات لكل منشور يبلغ 23.
- الاهتمامات الموضوعية: يركز المحتوى على مواضيع رئيسية مثل .net, шарписта, навигация, await, string.
📝 الوصف وسياسة المحتوى
يصف المؤلف القناة بأنها مساحة للتعبير عن الآراء الذاتية:
“Все самое полезное для C#-разработчика в одном канале.
Наши курсы: https://clc.to/y3LDtw
По рекламе: @proglib_adv
Для обратной связи: @proglibrary_feeedback_bot
РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead”
بفضل وتيرة التحديث المرتفعة (أحدث البيانات بتاريخ 30 أغسطس, 2026) تحافظ القناة على حداثتها ومستوى وصول مرتفع. وتُظهر التحليلات تفاعلاً نشطاً من الجمهور، ما يجعلها نقطة تأثير مهمة ضمن فئة التكنولوجيات والتطبيقات.
Dictionary<string, int> scores = new();
Вместо повторения полного типа справа, достаточно просто написать new(). Фича доступна с C# 9.
🐸Библиотека шарписта
#sharp_viewConsole.WriteLine(nameof(List<>)); // Выведет "List"
🐸Библиотека шарписта
#sharp_viewpublic record WeatherData(string City, decimal Temperature, string Condition);
var data = new WeatherData("Москва", 15.5M, "Облачно");
var json = JsonSerializer.Serialize(data);
Console.WriteLine(json);
// {"City":"Москва","Temperature":15.5,"Condition":"Облачно"}
var deserialized = JsonSerializer.Deserialize<WeatherData>(json);
Ни лишних конструкторов, ни public setters, ни аннотаций. Десериализация понимает init-only свойства и positional параметры. Это делает API слой минималистичным и надёжным.
Работает и с Newtonsoft.Json, и с gRPC. Records — это естественный способ определения контрактов между системами.
🐸Библиотека шарписта
#sharp_viewSpan<T>, ReadOnlySpan<T> и массивами, упрощая манипуляции с данными и повышая скорость:
ReadOnlySpan<char> roSpan = "hello";
Span<char> span = roSpan;
char[] array = roSpan.ToArray();
Типы Span теперь могут выступать как принимающие методы расширения, то есть станут получателями вызова таких методов. Они также могут комбинироваться с другими типами преобразований.
🐸Библиотека шарписта
#il_люминаторpublic abstract record Shape;
public record Circle(double Radius) : Shape;
public record Rectangle(double Width, double Height) : Shape;
double CalculateArea(Shape shape) => shape switch
{
Circle(var r) => Math.PI * r * r,
Rectangle(var w, var h) => w * h,
_ => throw new ArgumentException("Неизвестная фигура")
};
Никаких is checks, никаких кастов, никакого боксинга. Компилятор знает структуру и гарантирует полноту проверки всех случаев.
Можете комбинировать с проверками свойств:
if (shape is Rectangle { Width: > 100, Height: > 100 })
Console.WriteLine("Большой прямоугольник");
Это делает бизнес-логику выразительнее и безопаснее. Вместо цепочки if-else с кастами получаете элегантный switch:
public abstract record OrderStatus;
public record Pending : OrderStatus;
public record Shipped(DateTime Date) : OrderStatus;
public record Cancelled(string Reason) : OrderStatus;
string Describe(OrderStatus status) => status switch
{
Pending => "Ожидает отправки",
Shipped(var date) => $"Отправлен {date:d}",
Cancelled(var reason) => $"Отменён: {reason}",
};
🐸Библиотека шарписта
#sharp_viewprivate string _msg;
public string Message
{
get => _msg;
set => _msg = value ?? throw new ArgumentNullException(nameof(value));
}
Сейчас field ссылается на поле, которое создает компилятор, сокращая код:
public string Message
{
get;
set => field = value ?? throw new ArgumentNullException(nameof(value));
}
Минимум кода — максимум контроля: write-only свойства снаружи и строгая логика внутри.
🐸Библиотека шарписта
#il_люминаторpublic static class EnumerableExtensions
{
extension<TSource>(IEnumerable<TSource> source)
{
public bool IsEmpty => !source.Any(); // Расширенное свойство
}
extension<TSource>(IEnumerable<TSource>)
{
public static IEnumerable<TSource> Combine(IEnumerable<TSource> first, IEnumerable<TSource> second)
=> first.Concat(second); // Статический метод расширения
}
}
Конструкция extension<TSource>(IEnumerable<TSource> source) — это новый синтаксис блока расширения для экземпляра типа: здесь определяются расширяющие члены, которые «прикрепляются» к объекту IEnumerable<TSource>.
Внутри блока объявлено свойство IsEmpty, которое возвращает true, если последовательность пуста (!source.Any()).
Второй блок extension<TSource>(IEnumerable<TSource>) — расширение для самого типа IEnumerable<TSource> как статического члена.
Внутри него определён статический метод Combine, который принимает две последовательности и объединяет их с помощью Concat.
Как это использовать:
var list = new List<int> { 1, 2, 3 };
bool empty = list.IsEmpty; // false — вызов расширенного свойства как у экземпляра
var combined = Enumerable<int>.Combine(new[] { 1 }, new[] { 2, 3 }); // {1, 2, 3}
🐸Библиотека шарписта
#il_люминаторusing (var connection = new SqlConnection(connString))
{
connection.Open();
// Сюда кладём код работы с ресурсом
} // Dispose вызывается автоматически при выходе из блока
Чётко, понятно, но возникают лишние скобки и с отступами порой становится сложнее. Особенно, если таких блоков много.
А теперь взгляд современного разработчика:
using var connection = new SqlConnection(connString);
connection.Open();
// Здесь код с использованием ресурса
// Dispose вызовется автоматически при выходе из области видимости метода
Минимализм, читаемость, меньше шума. Но важно помнить, что Dispose произойдёт в конце метода, а не сразу после строки.
💬 Что выбираете вы? Старый стиль с блоками или лаконичный using?
🐸Библиотека шарписта
#entry_pointpublic 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_view