This media is not supported in your browser
VIEW IN TELEGRAM
Здесь собраны пошаговые гайды по базовому синтаксису C#, объектно-ориентированному программированию, LINQ, async/await, работе с SQLite, файловой системой и многим другим.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11❤6👍5
Почему HashSet лучше List для частых Contains()?
Когда коллекция нужна только для проверки “есть элемент или нет”,
Проблема обычно появляется в циклах, где
Снаружи всё выглядит нормально, но на больших объёмах такой код начинает делать лишнюю работу.
Если порядок элементов не важен и коллекция нужна именно для быстрых проверок, лучше использовать
Так код лучше отражает намерение: мы храним набор значений не ради списка, а ради быстрых проверок на вхождение.
🔥 Если коллекция нужна в первую очередь для
➡️ C# Ready | #совет
Когда коллекция нужна только для проверки “есть элемент или нет”,
List выглядит привычно, но работает не так удачно, как может показаться. Особенно если таких проверок много.Проблема обычно появляется в циклах, где
Contains() вызывается снова и снова.var ids = blockedUsers.Select(x => x.Id).ToList();
foreach (var order in orders)
{
if (ids.Contains(order.UserId))
{
order.MarkForReview();
}
}
Снаружи всё выглядит нормально, но на больших объёмах такой код начинает делать лишнюю работу.
List приходится каждый раз последовательно искать нужный элемент, и при частых проверках это быстро становится узким местом.Если порядок элементов не важен и коллекция нужна именно для быстрых проверок, лучше использовать
HashSet.var ids = blockedUsers.Select(x => x.Id).ToHashSet();
foreach (var order in orders)
{
if (ids.Contains(order.UserId))
{
order.MarkForReview();
}
}
Так код лучше отражает намерение: мы храним набор значений не ради списка, а ради быстрых проверок на вхождение.
Contains(), это почти всегда хороший повод выбрать HashSet.Please open Telegram to view this post
VIEW IN TELEGRAM
❤14👍3🔥3
This media is not supported in your browser
VIEW IN TELEGRAM
Проект постоянно обновляется сообществом и уже включает тысячи книг, курсов и обучающих ресурсов на разных языках, включая русский . Всё удобно разбито по категориям, отдельные разделы посвящены C++, C#, поэтому можно быстро найти нужную тему и начать изучение. Отлично подходит как база для самообучения.
Оставляю ссылочку: GitHub📱
Please open Telegram to view this post
VIEW IN TELEGRAM
❤19🔥11👍9
Почему интерполяция строк читается лучше, чем конкатенация через +?
Когда строка собирается из нескольких частей, запись с
При чтении приходится отдельно воспринимать текст, переменные, кавычки, знаки
Например, здесь:
формально всё просто, но читается такая запись не сразу.
Особенно если строка становится длиннее, переменных больше, а формат сложнее.
Гораздо проще воспринимается такой вариант:
Интерполяция показывает результат почти в готовом виде.
Ты сразу видишь, какой текст получится на выходе, и не тратишь внимание на склеивание частей.
Особенно хорошо это заметно в логах, сообщениях, ошибках, DTO-моделях и любом месте, где строка формируется из нескольких значений.
🔥 Маленькая замена, а строка становится понятной уже с первого взгляда.
➡️ C# Ready | #совет
Когда строка собирается из нескольких частей, запись с
+ выглядит тяжелее, чем должна.При чтении приходится отдельно воспринимать текст, переменные, кавычки, знаки
+ — и только потом мысленно собирать всё это в итоговую строку.Например, здесь:
var message = "User: " + name + ", age: " + age;
формально всё просто, но читается такая запись не сразу.
Особенно если строка становится длиннее, переменных больше, а формат сложнее.
Гораздо проще воспринимается такой вариант:
var message = $"User: {name}, age: {age}";Интерполяция показывает результат почти в готовом виде.
Ты сразу видишь, какой текст получится на выходе, и не тратишь внимание на склеивание частей.
Особенно хорошо это заметно в логах, сообщениях, ошибках, DTO-моделях и любом месте, где строка формируется из нескольких значений.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤17👍8🔥4👎2
Например, CPU cache и RAM дают минимальную задержку и используются для быстрых вычислений, а cloud storage и базы данных — для долговременного хранения и масштабирования.
На картинке — основные типы storage, которые используются в современных системах: от памяти процессора до облачных решений.
Сохрани, чтобы не потерять!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤9🔥7🤝1
This media is not supported in your browser
VIEW IN TELEGRAM
Форум, где можно обсуждать задачи, получать помощь и разбирать кейсы из разработки. Есть активные разделы по C++ и C#: обсуждение синтаксиса, разбор ошибок, советы по обучению и практическая помощь. Форум можно использовать как источник знаний, особенно когда требуется разобраться в конкретной задаче или посмотреть, как её решают другие разработчик.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16🤝6❤5
Почему nameof() лучше, чем строка, написанная руками?
Когда имя параметра или свойства передаётся обычной строкой, код становится более хрупким.
На первый взгляд всё выглядит нормально, но у такого подхода есть слабое место: строка никак не связана с самим кодом.
Например:
Пока параметр действительно называется
Но если позже кто-то переименует его, например в
Гораздо надёжнее использовать
В этом случае имя берётся прямо из кода.
Если параметр переименуют, выражение тоже обновится при рефакторинге, и код останется корректным.
По сути, это простая привычка, которая помогает избежать мелких, но неприятных ошибок при изменениях в коде.
🔥 Маленькая деталь, а код становится надёжнее и лучше переживает рефакторинг.
📣 C++ Ready | #совет
Когда имя параметра или свойства передаётся обычной строкой, код становится более хрупким.
На первый взгляд всё выглядит нормально, но у такого подхода есть слабое место: строка никак не связана с самим кодом.
Например:
throw new ArgumentNullException("user");Пока параметр действительно называется
user, проблем нет.Но если позже кто-то переименует его, например в
currentUser, строка останется старой. В итоге код уже изменился, а текст внутри исключения — нет.Гораздо надёжнее использовать
nameof():throw new ArgumentNullException(nameof(user));
В этом случае имя берётся прямо из кода.
Если параметр переименуют, выражение тоже обновится при рефакторинге, и код останется корректным.
По сути, это простая привычка, которая помогает избежать мелких, но неприятных ошибок при изменениях в коде.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤26👍9🔥5
This media is not supported in your browser
VIEW IN TELEGRAM
Здесь публикуются подробные разборы ошибок, уязвимостей и практик разработки. Основной фокус на статический анализ кода и реальные кейсы из проектов, включая разборы популярных open-source решений. Блог активно покрывает C++ и C#: публикуются статьи по анализу, поиску багов, особенностям работы компиляторов и практике.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14❤6👍5
Dictionary<TKey, TValue> — быстрый доступ к данным по ключу
Иногда нужно хранить данные так, чтобы быстро находить значение не по индексу, а по ключу.
Например, у нас есть набор пользователей и их возрастов.
Если хранить это в массиве или списке, поиск будет менее удобным.
В C# для таких задач используется
Создадим словарь, где ключ — это имя, а значение — возраст:
Здесь:
Мы обращаемся к словарю по ключу
Вот что получится при запуске:
🔥
➡️ C# Ready | #практика
Иногда нужно хранить данные так, чтобы быстро находить значение не по индексу, а по ключу.
Например, у нас есть набор пользователей и их возрастов.
Если хранить это в массиве или списке, поиск будет менее удобным.
В C# для таких задач используется
Dictionary<TKey, TValue>:using System;
using System.Collections.Generic;
Создадим словарь, где ключ — это имя, а значение — возраст:
Dictionary<string, int> ages = new Dictionary<string, int>
{
["Анна"] = 25,
["Игорь"] = 31,
["Мария"] = 28
};
Console.WriteLine(ages["Игорь"]);
Здесь:
string — тип ключа,int — тип значения.Мы обращаемся к словарю по ключу
"Игорь" и сразу получаем его возраст.Вот что получится при запуске:
31
Dictionary удобно использовать, когда нужно быстро получать данные по имени, id, коду или любому другому ключуPlease open Telegram to view this post
VIEW IN TELEGRAM
🔥14👍5❤4
Например, CPU хорошо справляется с логикой, ветвлениями и задачами с низкой задержкой. GPU — про массовый параллелизм: подходит для обработки больших массивов данных, графики и вычислений.
На картинке — наглядное сравнение архитектуры, модели вычислений и типичных сценариев применения для каждого типа процессоров.
Сохрани, чтобы не потерять!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🤝7❤6
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤12🔥8👍4🤝3
В этой статье:
• Подготовка базы данных PostgreSQL и настройка миграций EF Core• Проектирование моделей данных и сервисных методов обмена сообщениями• Реализация клавиатур и inline-кнопок для удобного интерфейса бота🟡 Рекомендую прочитать на Habr!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9👍7🔥5👎1
Обрабатываем пары значений с tuple-паттернами в switch!
Часто в коде нужно принимать решение сразу по нескольким переменным. Например, по координатам точки — находится ли она в начале координат, на осях или в другой области.
Раньше такую логику реализовывали через цепочку
Такой код быстро становится громоздким и сложным для поддержки при добавлении новых условий.
Сейчас перепишем на современный
🔥 Выражение стало компактнее, логика читается лучше, а добавление новых комбинаций — проще.
➡️ C# Ready | #практика
Часто в коде нужно принимать решение сразу по нескольким переменным. Например, по координатам точки — находится ли она в начале координат, на осях или в другой области.
Раньше такую логику реализовывали через цепочку
if-ов:if (x == 0 && y == 0)
return "Начало координат";
else if (x == 0)
return "На оси Y";
else if (y == 0)
return "На оси X";
else
return "Другая точка";
Такой код быстро становится громоздким и сложным для поддержки при добавлении новых условий.
Сейчас перепишем на современный
switch с tuple-паттернами:return (x, y) switch
{
(0, 0) => "Начало координат",
(0, _) => "На оси Y",
(_, 0) => "На оси X",
_ => "Другая точка"
};
🔥 Выражение стало компактнее, логика читается лучше, а добавление новых комбинаций — проще.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤13🔥6👍3
This media is not supported in your browser
VIEW IN TELEGRAM
Здесь вы найдёте базовые руководства по синтаксису языка, работу с переменными, операциями, массивами и строками, основы ООП, алгоритмы, структуры данных, а также практические задания и готовые программы для отработки навыков.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10❤6👍6👎1
Почему nameof() лучше, чем строка, написанная руками?
Когда имя параметра или свойства передаётся обычной строкой, код становится более хрупким.
На первый взгляд всё выглядит нормально, но у такого подхода есть слабое место: строка никак не связана с самим кодом.
Например:
Пока параметр действительно называется
Но если позже кто-то переименует его, например в
Гораздо надёжнее использовать
В этом случае имя берётся прямо из кода.
Если параметр переименуют, выражение тоже обновится при рефакторинге, и код останется корректным.
По сути, это простая привычка, которая помогает избежать мелких, но неприятных ошибок при изменениях в коде.
🔥 Маленькая деталь, а код становится надёжнее и лучше переживает рефакторинг.
➡️ C# Ready | #совет
Когда имя параметра или свойства передаётся обычной строкой, код становится более хрупким.
На первый взгляд всё выглядит нормально, но у такого подхода есть слабое место: строка никак не связана с самим кодом.
Например:
throw new ArgumentNullException("user");Пока параметр действительно называется
user, проблем нет.Но если позже кто-то переименует его, например в
currentUser, строка останется старой. В итоге код уже изменился, а текст внутри исключения — нет.Гораздо надёжнее использовать
nameof():throw new ArgumentNullException(nameof(user));
В этом случае имя берётся прямо из кода.
Если параметр переименуют, выражение тоже обновится при рефакторинге, и код останется корректным.
По сути, это простая привычка, которая помогает избежать мелких, но неприятных ошибок при изменениях в коде.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥4❤3😁1
Например, регистры — это самый быстрый уровень памяти внутри CPU, кэш (L1/L2/L3) снижает latency за счёт локальности данных, RAM хранит рабочее состояние приложений, а SSD/HDD используются для персистентного хранения с существенно более высоким временем доступа.
На картинке — базовая иерархия памяти, взаимодействие CPU — cache — RAM — disk, а также упрощённая модель работы HDD и архитектура SSD.
Сохрани, чтобы не потерять!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10❤6👍6