uk
Feedback
C# 1001 notes

C# 1001 notes

Відкрити в Telegram

Регулярные короткие заметки по C# и .NET. Просто о сложном для каждого. admin - @haarrp

Показати більше
6 612
Підписники
+924 години
+667 днів
+5630 день
Архів дописів
1

ХОЧЕШЬ ПОВЫШЕНИЕ В 2024 ГОДУ? 😎🔥 Согласно опросу, проведенному компанией Solo.io в 2022 году, на текущий момент 85% организ
ХОЧЕШЬ ПОВЫШЕНИЕ В 2024 ГОДУ? 😎🔥 Согласно опросу, проведенному компанией Solo.io в 2022 году, на текущий момент 85% организаций переводят свои IT-системы на микросервисную архитектуру. Но специалистов, которые глубоко понимают все тонкости и нюансы микросервисной архитектуры не так-то много. Самое время разобраться в микросервисной архитектуре и стать более востребованным специалистом. 🚀 Стартуем 9 апреля. Курс ведет действующий архитектор Кирилл Ветчинкин. Он успешно реализовал проекты с применением микросервисов для Мегафона, Теле2, ВСS Brокer, СберМаркет. Постоянный спикер крупных IT-конференций. На курсе вы: 📌 Изучите и отработаете более 20 паттернов микросервисной архитектуры 📌 Познакомитесь c Domain Driven Design 📌 Научитесь декомпозировать систему на микросервисы с помощью Event Storming и DDD Полная программа ТУТ https://microarch.ru/?utm_source=posev&utm_medium=erid:2VtzqwKifY2&utm_campaign=3 А самое главное — будет поддержка от эксперта, чат с одногруппниками и интересное практическое задание. Сертификат об участии по итогам прохождения курса. Курс ориентирован на системных аналитиков и разработчиков, которые хотят больше погрузиться в архитектуру современных IT систем. Узнай больше о курсе 👉 https://microarch.ru/?utm_source=posev&utm_medium=erid:2VtzqwKifY2&utm_campaign=3 Реклама. ИП Ветчинкин К.Е. ИНН: 773376451099 Erid: 2VtzqwKifY2

🖥 Небольшой проект, который вы могли бы добавить в свое резюме 👇 Реализация сервиса для сокращения URL-адресов с помощью .NET: Создадим эндпоинты. Первая принимает URL, создаёт короткий URL и возвращает его:
csharp 
app.MapPost("shorten", async (
    string url,
    UrlShorteningService svc,
    AppDbContext dbCtx,
    HttpContext httpCtx) =>
{
  if (!Uri.TryCreate(url, UriKind.Absolute, out _))
    return Results.BadRequest(
     "Предоставленный URL неверный.");

  var code = await svc.GetCode();
  var req = httpCtx.Request;
  var shortUrl = new ShortUrl
  {
    Id = Guid.NewGuid(),
    Url = url,
    Code = code,
    CreatedOn = DateTime.UtcNow
  };
  dbCtx.ShortenedUrls.Add(shortUrl);
  await dbCtx.SaveChangesAsync();
  return Results.Ok(
   $"{req.Scheme}://{req.Host}/{code}");
});
Здесь возникает небольшая ситуация гонки, поскольку мы сначала генерируем уникальный код, а затем вставляем его в БД. Параллельный запрос может сгенерировать тот же уникальный код и вставить его в БД до того, как мы завершим транзакцию. Однако вероятность того, что это произойдет, невелика, кроме того, уникальный ключ в БД защищает нас от дублирования значений. Второй эндпоинт перенаправит на исходный URL при доступе к сокращённому:
csharp 
app.MapGet("{code}", 
 async (
  string code, 
  AppDbContext dbCtx) =>
{
  var shortUrl = await 
   dbCtx.ShortUrls
    .SingleOrDefaultAsync(
     s => s.Code == code);

  if (shortUrl is null)
    return Results.NotFound();

  return Results.Redirect(shortUrl.Url);
});
Эта конечная точка ищет код в БД и, если он найден, перенаправляет пользователя на исходный длинный URL. Ответ будет иметь код состояния 302 (Found) согласно стандартам HTTP. Недостатки и возможные улучшения 1. Недостатком реализации сервиса является длинная задержка, т.к. мы проверяем каждый генерируемый код в БД. Улучшением может стать заблаговременное создание уникальных кодов в БД. 2. Кэширование второй конечной точки позволит снизить нагрузку на БД для часто используемых коротких URL. 📌 Подробнее @csharp_1001_notes

🖥 Что полезного в новых версиях C# Держите годное видео, в котором систематизируются знания о новых возможностях языка начин
🖥 Что полезного в новых версиях C# Держите годное видео, в котором систематизируются знания о новых возможностях языка начиная с C#8 по C#11, а также обсуждаются на примерах новейшие возможности C# 12 и .NET 8. 📎 YouTube @csharp_1001_notes

🖥 Преобразуйте базу данных SQL Server в базу данных SQLite из Code project. https://codeproject.com/Articles/26932/Convert-S
🖥 Преобразуйте базу данных SQL Server в базу данных SQLite из Code project. https://codeproject.com/Articles/26932/Convert-SQL-Server-DB-to-SQLite-DB https://github.com/karenpayneoregon/sqlserver-to-sqllite @csharp_1001_notes

🖥 Прочитать Nullable из строки ⏩Итак, дан код: long? catCode = null; // Если строка val не пустая, if (!(String.IsNullOrWhit
🖥 Прочитать Nullable<long> из строки ⏩Итак, дан код:

long? catCode = null;
// Если строка val не пустая, 
if (!(String.IsNullOrWhiteSpace(val)))
{
    // распознаем в первых цифрах до пробела целое 64-битное число.
    // Если его там нет, записываем в catCode NULL. 
    // Если его удалось распознать, записываем его в catCode.
    if (!(Int64.TryParse(val.Split(" ")[0], out long cc)))
    {
        catCode = null;
    }
    else 
    {
        catCode = cc;
    }
}
Как переписать этот код чуть понятнее? ⏩Как вариант, можно написать что-то в духе:

public static string LeftDigits(this string str)
{
    if (str == null) return null;
    if (!str.contains(" ") return null;
    string left = str.Split(" ")[0];
    if (! left.All(Char.IsDigit){
        return null;
    }
    return left;
}

//... 

string digits = LeftDigits(val);
long? catCode = digits != null ? Int64.Parse(digits) : null;
А есть ли ещё варианты? Можете накидать свои в комментах @csharp_1001_notes

⚡️Компания Аванпост в поисках Разработчиков C# (Junior + / Middle) 🚀Какие задачи предстоит решать? - Интеграционная разработ
⚡️Компания Аванпост в поисках Разработчиков C# (Junior + / Middle) 🚀Какие задачи предстоит решать? - Интеграционная разработка - Разработка подключаемых модулей приложений (non-GUI) в соответствии с заданными интерфейсами, сервисов и приложений интеграционного слоя - По мере профессионального роста – расширение сферы деятельности 👨‍💻Какие требования к кандидатам? - Знание: С#, .Net Core - Понимание концепций ООП и базовых шаблонов проектирования - Понимание принципов работы реляционных СУБД - Опыт написания простых SQL-запросов и работы с БД - Технический английский, чтение документации и профессиональной литературы 🔥Что мы предлагаем: - Удаленный формат работы - Зарплата по результатам собеседования и определения навыков соискателя - Профессиональный рост - Оформление по ТК РФ Узнал себя?  Принимай участие в One Day Offer и становись частью крупной IT-компании! Подробности и регистрация: https://tglink.io/aea5ca1b4725

🔥 Создание отказоустойчивых облачных сервисов с помощью .NET 8 В новой версии .NET представлены пакеты Microsoft.Extensions.Http.Resilience и Microsoft.Extensions.Resilience, основанные на библиотеке Polly. Их главная цель — упростить интеграцию отказоустойчивости в ваши приложения.
dotnet add package Microsoft.Extensions.Http.Resilience
<ItemGroup>
  <PackageReference Include="Microsoft.Extensions.Http.Resilience" />
</ItemGroup>
var services = new ServiceCollection();

services.AddHttpClient("my-client")
        .AddStandardResilienceHandler(options =>
        {
            // Configure standard resilience options here
        });

Устал писать тесты с кучей моков? Сложно поддерживать приложение, ведь бизнес логика перемешалась с инфраструктурой? 😰 Присо
Устал писать тесты с кучей моков? Сложно поддерживать приложение, ведь бизнес логика перемешалась с инфраструктурой? 😰 Присоединяйся к нашему практическому курсу по Domain Driven Design, где за 10 вебинаров мы разложим все по полочкам. 🚀Стартуем 1 апреля. Присоединяйся прямо сейчас https://microarch.ru/courses/hexagonal-architecture?utm_source=posev&utm_medium=erid:2VtzqwtV8Fo&utm_campaign=9 Наш курс по Domain-Driven Design позволит вам изучить основы и принципы этого подхода, а также освоить практические навыки, необходимые для успешного применения DDD в реальных проектах. Вы узнаете: ✅ Что такое Domain-Driven Design и почему он так важен для современных разработчиков. ✅ Основы проектирования доменов и формирование предметной области. ✅ Принципы и методы моделирования предметной области, включая разработку моделей предметной области и определение бизнес-правил. ✅ Создание эффективных и масштабируемых сервисов с использованием DDD. ✅ Применение шаблонов проектирования и принципов DDD для оптимизации кода и повышения производительности. Курс ведет действующий архитектор и разработчик Кирилл Ветчинкин. Он успешно реализовал проекты для Мегафона, Теле2, ВСS Brокer. Постоянный спикер крупных IT-конференций. Не упусти шанс стать экспертом! Присоединяйся к нашему курсу и раскрой свой потенциал в разработке успешных проектов уже сегодня https://microarch.ru/courses/hexagonal-architecture?utm_source=posev&utm_medium=erid:2VtzqwtV8Fo&utm_campaign=9 Реклама. ИП Ветчинкин К.Е. ИНН: 773376451099 Erid: 2VtzqwtV8Fo

🖥 Garnet — кэш от Microsoft, написан на C#, уделывает и Redis, и Dragonfly Как видно из бенчмарков, это сейчас вообще самый
🖥 Garnet — кэш от Microsoft, написан на C#, уделывает и Redis, и Dragonfly Как видно из бенчмарков, это сейчас вообще самый быстрый сервер структур данных на всём диком западе: Практически полностью совместим с Redis на уровне API, но при этом: ⏩Имеет либеральную MIT лицензию, как и все последние крупные проекты MS, и этим крайне выгодно отличается от Redis ⏩Написан на C#, и позволяет удобно расширять сервер ⏩Делает по производительности и Redis, написанный на C, и Dragonfly написанный на C++ 🖥 GitHub @csharp_1001_notes

🦾Хардкорный тест по языку С🦾 📌Пройдите полный тест из 20 вопросов на сайте и проверьте, насколько вы готовы к обучению на
🦾Хардкорный тест по языку С🦾 📌Пройдите полный тест из 20 вопросов на сайте и проверьте, насколько вы готовы к обучению на углубленном курсе - «Программист С» от OTUS. Сможете сдать - пройдете на курс с финальной скидкой 10% по промокоду devc10 ⏰ Время прохождения теста ограничено 30 минут 👉ПРОЙТИ ТЕСТ

🖥 Garnet — кэш от Microsoft, написан на C#, уделывает и Redis, и Dragonfly Как видно из бенчмарков, это сейчас вообще самый
🖥 Garnet — кэш от Microsoft, написан на C#, уделывает и Redis, и Dragonfly Как видно из бенчмарков, это сейчас вообще самый быстрый сервер структур данных на всём диком западе: Практически полностью совместим с Redis на уровне API, но при этом: ⏩Имеет либеральную MIT лицензию, как и все последние крупные проекты MS, и этим крайне выгодно отличается от Redis ⏩Написан на C#, и позволяет удобно расширять сервер ⏩Делает по производительности и Redis, написанный на C, и Dragonfly написанный на C++ 🖥 GitHub @csharp_ci

❓Как С#-разработчику вырасти до уровня Senior в 2024? Изучить .NET Framework, Scrum-методики и многое другое на онлайн-курсе
❓Как С#-разработчику вырасти до уровня Senior в 2024? Изучить .NET Framework, Scrum-методики и многое другое на онлайн-курсе «C# Developer. Professional» от OTUS. Программа идеально подходит для начинающих C#-разработчиков, которые хотят развиваться в серверной разработке, создании приложений и микросервисов. На курсе вас ждут: - живые вебинары с возможностью задать вопросы экспертам; - много практики и сильные проекты для портфолио; - поддержка профессионального комьюнити. 👉 Пройдите бесплатный тест прямо сейчас и узнайте, готовы ли вы сделать следующий шаг в карьере: https://otus.pw/t0cH/?erid=LjN8K2M3G Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.

🖥Что такое NullReferenceException, и как исправить? Итак кейс: выполняется некоторый код, выбрасывается исключение NullRefer
🖥Что такое NullReferenceException, и как исправить? Итак кейс: выполняется некоторый код, выбрасывается исключение NullReferenceException со следующим сообщением:
Object reference not set to an instance of an object (В экземпляре объекта не задана ссылка на объект)
Что же это значит, и как исправить код? ⏩В двух словах Вы пытаетесь воспользоваться чем-то, что равно null (или Nothing в VB.NET). Это означает, что либо вы присвоили это значение, либо вы ничего не присваивали. Как и любое другое значение, null может передаваться от объекта к объекту, от метода к методу. Если нечто равно null в методе "А", вполне может быть, что метод "В" передал это значение в метод "А". ⏩Более подробно Если среда выполнения выбрасывает NullReferenceException, то это всегда означает: вы пытаетесь воспользоваться ссылкой. И эта ссылка не инициализирована (или уже не инициализирована). Это означает, что ссылка равна null, а вы не сможете вызвать методы через ссылку, равную null, как тут:
string foo = null;
foo.ToUpper();
Этот код выбросит исключение NullReferenceException на 2 строке, потому что вы не можете вызвать метод ToUpper() у ссылки на string, равной null. ⏩Отладка Как определить источник ошибки? Общие рекомендации: поставьте точки останова в ключевых местах, изучите значения переменных, расположив курсор мыши над переменной, либо открыв панели для отладки: Watch, Locals, Autos. Если вы хотите определить место, где значение ссылки устанавливается (или нет), нажмите ПКМ на её имени и выберите "Find All References". Затем вы можете поставить точки останова на каждой найденной строке и запустить приложение в режиме отладки. Каждый раз, когда отладчик остановится на точке останова, вы можете удостовериться, что значение верное. Так вы придёте к месту, где значение ссылки не должно быть null, и определите, почему не присвоено верное значение. 📎 Очень подробное обсуждение этой проблемы с примерами @csharp_ci

Смартфон за ваш ответ! Исследовательская компания OMI проводит опрос среди IT-специалистов. Пройдите по ссылке, ответьте на н
Смартфон за ваш ответ! Исследовательская компания OMI проводит опрос среди IT-специалистов. Пройдите по ссылке, ответьте на несколько вопросов и получите шанс выиграть последнюю модель передового смартфона! Примите участие в опросе прямо сейчас — это займет минимум времени.

🖥 Моя коллекция 50+ вопросов для собеса C# https://habr.com/ru/articles/801369/ @csharp_1001_notes

🖥 Интересная статья о паттерне «Спецификация» в С# ⏩О чём статья? О паттерне «Спецификация», который позволяет улучшить стру
🖥 Интересная статья о паттерне «Спецификация» в С#О чём статья? О паттерне «Спецификация», который позволяет улучшить структуру приложения, и, следовательно, увеличить гибкость, уменьшив при этом объем кода, а значит - сократить количество ошибок, но это не точно. ⏩К статье приложен пример Web API приложения, написанный с использованием анемичной доменной модели, библиотеки MediatR, Postgres и Docker Compose. Всё, как Вы любите и, таки да, анемичной доменной моделью мы нарушим инкапсуляцию, без этого никуда. 📎 Статья @csharp_1001_notes

Из бариста в бэкенд-разработчики, из офис-менеджера в UX-дизайнеры. Такие истории интригуют и вдохновляют. Но будут ли работо
Из бариста в бэкенд-разработчики, из офис-менеджера в UX-дизайнеры. Такие истории интригуют и вдохновляют. Но будут ли работодатели в IT серьёзно воспринимать вас, если вы закончите онлайн-курс? Расскажем, что мы делаем в Яндекс Практикуме, чтобы так и было. → Бесплатно, 21 марта в 18:00 Мск На большом онлайн-событии покажем учёбу в Практикуме изнутри. Вы узнаете: — кто поддерживает студентов и не даёт опустить руки до самого трудоустройства; — почему мы добавили в свою платформу YandexGPT и как нейросеть помогает учиться; — кто передаёт студентам знания и навыки, которые нужны в IT прямо сейчас; — как студенты становятся готовыми практиками. → Зарегистрироваться на онлайн-событие

🖥 В чем преимущества асинхронного кода на C#? Разберём на примере. ⏩Вот, полностью асинхронный код: Console.WriteLine("Start
🖥 В чем преимущества асинхронного кода на C#? Разберём на примере. ⏩Вот, полностью асинхронный код:
Console.WriteLine("Start Main");
// Запускаем задачу PrintAsync и спокойно идём дальше
var printTask = PrintAsync();
Console.WriteLine("End Main");
// Ждём завершения задачи PrintAsync
await printTask;

async Task PrintDelayAsync()
{
    // Ждём 3 секунды, но при этом поток не будет занят
    await Task.Delay(3000);
    Console.WriteLine("Print");
}

async Task PrintAsync()
{
    Console.WriteLine("Start PrintAsync");
    // Ждём пока метод отработает, но поток не занят
    await PrintDelayAsync();
    Console.WriteLine("End PrintAsync");
}
⏩Весь этот код может выполняться даже одним потоком, при этом в моменты ожидания await этот поток освобождается может выполнять какие-то другие асинхронные задачи из вашего кода, если они у вас будут. ⏩Пример параллельного исполнения задач:
Console.WriteLine("Start Main");
await PrintAsync();
Console.WriteLine("End Main");

async Task Print1Async()
{
    await Task.Delay(3000);
    Console.WriteLine("Print 1");
}

async Task Print2Async()
{
    await Task.Delay(2000);
    Console.WriteLine("Print 2");
}

async Task Print3Async()
{
    await Task.Delay(1000);
    Console.WriteLine("Print 3");
}

async Task PrintAsync()
{
    Console.WriteLine("Start PrintAsync");
    var tasks = new List<Task>() { Print1Async(), Print2Async(), Print3Async() };
    await Task.WhenAll(tasks);
    Console.WriteLine("End PrintAsync");
}
⏩Вывод:
Start Main
Start PrintAsync
Print 3
Print 2
Print 1
End PrintAsync
End Main
⏩То есть суть в чём — запустились сразу 3 задачи, выполнились они не в том порядке, как были запущены, а где меньше задержка, та раньше и выполнилась. При этом, повторюсь, достаточно одного потока, чтобы выполнять этот код. Что очень существенно, когда речь идёт о сильно загруженных программах типа веб-сервера или какого-то обработчика данных реального времени. @csharp_ci

Вариант для тех, кто ищет виртуальный сервер с хорошей веб-защитой — Aéza: – Виртуальные сервера до 6.0 ГГц на лучших процесс
Вариант для тех, кто ищет виртуальный сервер с хорошей веб-защитой — Aéza: – Виртуальные сервера до 6.0 ГГц на лучших процессорах; – Профессиональная фильтрация атак StormWall; – Круглосуточная поддержка; – Anycast фильтрация; – Низкие цены; – 15% кешбэка по ссылке. Бесконечно можно смотреть на три вещи: на огонь, воду и скидку от Aeza! Говорят: твоё от тебя не уйдет. А зачем ждать? Динозавры тоже ждали и остались в прошлом Используй 50% скидку и погнали в будущее! Кроме того, сейчас Aéza раздает личные бесплатные сервера, забираем тут. Регистрация, подписка, платежи не потребуются. Реклама. Индивидуальный предприниматель Лобанов Леонид Константинович. ИНН 781625705648 erid: LjN8KEr3S