Что выведет на экран этот код?
Anonymous Quiz
35%
Class Executed, Interface Executed
41%
Class Executed, Class Executed
8%
Interface Executed, Interface Executed
16%
Возникнет ошибка компиляции "Cannot resolve method"
⚡️Feature Flags в .NET и их применения для A/B-тестирования
Возможность условно включать или выключать функции в вашем приложении без изменения кода - мощный и полезный инструмент.
Для этого можно использовать Feature Flags.
Feature Flags- это техника разработки программного обеспечения, которая позволяет обернуть функции приложения в условный оператор.
Затем вы можете включить или выключить функцию во время выполнения, чтобы контролировать, применение этих функции
▪Читать дальше
@csharp_ci
Возможность условно включать или выключать функции в вашем приложении без изменения кода - мощный и полезный инструмент.
Для этого можно использовать Feature Flags.
Feature Flags- это техника разработки программного обеспечения, которая позволяет обернуть функции приложения в условный оператор.
Затем вы можете включить или выключить функцию во время выполнения, чтобы контролировать, применение этих функции
Install-Package Microsoft.FeatureManagement
▪Читать дальше
@csharp_ci
⚡️ASP .NET Core предоставляет вам несколько способов глобальной обработки исключений.
Так какой же подход выбрать?
Стандартный способ реализации обработки исключений в ASP.NET Core — использование middleware.
Middleware позволяет добавлять логику до или после выполнения запросов. Для реализации обработки исключений достаточно добавить оператор
ASP.NET Core 8 добавляет новую абстракцию
Если исключение можно обработать, метод должен возвращать
Это позволяет реализовывать кастомную логику обработки исключений для различных сценариев.
🔗Для добавления реализации
1. Зарегистрировать сервис
2. Зарегистрировать
Вы можете добавить несколько реализаций
В ASP .NET Core 8 появилась новая абстракция IExceptionHandler для управления исключениями.
▪Подробнее
@csharp_ci
Так какой же подход выбрать?
Стандартный способ реализации обработки исключений в ASP.NET Core — использование middleware.
Middleware позволяет добавлять логику до или после выполнения запросов. Для реализации обработки исключений достаточно добавить оператор
try-catch
в middleware и возвращать ошибку HTTP-ответа. ASP.NET Core 8 добавляет новую абстракцию
IExceptionHandler
для управления исключениями. Этот интерфейс имеет только один метод TryHandleAsync
, который пытается обработать указанное исключение в рамках ASP.NET Core pipeline. Если исключение можно обработать, метод должен возвращать
true
, если нет — false
. Это позволяет реализовывать кастомную логику обработки исключений для различных сценариев.
🔗Для добавления реализации
IExceptionHandler
в пайплайн запросов ASP.NET Core необходимо сделать две вещи:1. Зарегистрировать сервис
IExceptionHandler
с помощью DI.2. Зарегистрировать
ExceptionHandlerMiddleware
в пайплайне запросов.builder
.
Services
.
AddExceptionHandler
<
GlobalExceptionHandler
>();
builder
.
Services
.
AddProblemDetails
();
app
.
UseExceptionHandler
();
Вы можете добавить несколько реализаций
IExceptionHandler
, и они будут вызываться в порядке регистрации. Это может быть полезно, например, при использовании исключений для управления потоком.В ASP .NET Core 8 появилась новая абстракция IExceptionHandler для управления исключениями.
▪Подробнее
@csharp_ci
Что произойдет если запустить это код?
Anonymous Quiz
53%
Ошибка компиляции, интерфейсы не могу иметь абстрактные методы
10%
Возникнет ошибка времени выполнения
36%
Hello world
🔥 Дайджест полезных материалов из мира C# за неделю
Почитать:
— Огромная шпаргалка с готовыми запросами SQL (SQLite)
— Где изучать C# в 2024. Бесплатные курсы и полезные ресурсы
— Об одном способе веб-скрапинга сайтов, защищенных Cloudflare
— Road Run, или как я свою первую игру делал. Часть 7
— Разобраться раз и навсегда: Task.WhenAll или Parallel.ForEachAsync в C#
— Обзор Инструментов Покрытия Кода для C#. Начало
— 20 инструментов командной строки для мониторинга производительности Linux
— Наш опыт мультиаутентификации в приложениях ASP.NET Core
— Кроссплатформенные ресурсы в сборках .NET — пишем условия MSBuild
— Валидация входных данных в фильтрах Minimal API .NET, просто и без затей
— Async/Await в C#. Часть 5. Функция-перечисление и цикл через рекурсию, асинхронный вызов без Async/Await
— Еще раз про асинхронную машину состояний и где именно там аллокации
— Outlook как сервер микросервисов
— Exploring the Dynamic Language Runtime (DLR) in C#
— Getting the Current User in Clean Architecture
— Difference Between Raw SQL and Dapper
— How to read zip files with SharpZip library in C#
— Action and Func Delegates in C#
— Game Dev Digest — Issue #221 - Rendering Techniques and more
— Intro to JS Interop in Blazor
— What is Memento Pattern in C#?
— Using auto-values in Aerospike LINQPad driver
— Custom Middleware In ASP.NET Core – How To Harness The Power
— Common Implementation Mistakes of Work Pattern in C#
Посмотреть:
🌐 Курс C# 2024 с нуля
🌐 Александр Кузнецов — Введение в Microsoft SignalR (⏱ 56:53)
🌐 Microsoft Is Abandoning C# for Rust! Now What? (⏱ 08:01)
🌐 Why .NET's Most Ambitious Feature Might Fail (⏱ 11:14)
🌐 "Don't Use Loops, They Are Slow! Do This Instead" | Code Cop #011 (⏱ 09:51)
🌐 The Easiest Scheduling for Your .NET Applications (⏱ 11:25)
🌐 Microsoft Is Abandoning C# for Rust! Now What? (⏱ 8:00)
Хорошего дня!
@csharp_ci
Почитать:
— Огромная шпаргалка с готовыми запросами SQL (SQLite)
— Где изучать C# в 2024. Бесплатные курсы и полезные ресурсы
— Об одном способе веб-скрапинга сайтов, защищенных Cloudflare
— Road Run, или как я свою первую игру делал. Часть 7
— Разобраться раз и навсегда: Task.WhenAll или Parallel.ForEachAsync в C#
— Обзор Инструментов Покрытия Кода для C#. Начало
— 20 инструментов командной строки для мониторинга производительности Linux
— Наш опыт мультиаутентификации в приложениях ASP.NET Core
— Кроссплатформенные ресурсы в сборках .NET — пишем условия MSBuild
— Валидация входных данных в фильтрах Minimal API .NET, просто и без затей
— Async/Await в C#. Часть 5. Функция-перечисление и цикл через рекурсию, асинхронный вызов без Async/Await
— Еще раз про асинхронную машину состояний и где именно там аллокации
— Outlook как сервер микросервисов
— Exploring the Dynamic Language Runtime (DLR) in C#
— Getting the Current User in Clean Architecture
— Difference Between Raw SQL and Dapper
— How to read zip files with SharpZip library in C#
— Action and Func Delegates in C#
— Game Dev Digest — Issue #221 - Rendering Techniques and more
— Intro to JS Interop in Blazor
— What is Memento Pattern in C#?
— Using auto-values in Aerospike LINQPad driver
— Custom Middleware In ASP.NET Core – How To Harness The Power
— Common Implementation Mistakes of Work Pattern in C#
Посмотреть:
🌐 Курс C# 2024 с нуля
🌐 Александр Кузнецов — Введение в Microsoft SignalR (⏱ 56:53)
🌐 Microsoft Is Abandoning C# for Rust! Now What? (⏱ 08:01)
🌐 Why .NET's Most Ambitious Feature Might Fail (⏱ 11:14)
🌐 "Don't Use Loops, They Are Slow! Do This Instead" | Code Cop #011 (⏱ 09:51)
🌐 The Easiest Scheduling for Your .NET Applications (⏱ 11:25)
🌐 Microsoft Is Abandoning C# for Rust! Now What? (⏱ 8:00)
Хорошего дня!
@csharp_ci
В C# для сравнения строк без учета регистра лучше использовать
string.Equals
с OrdinalIgnoreCase,
а не ToLower() / ToUpper().
▪Почему?
Корректность
Иногда использование
ToLower/Upper
может привести к неправильным результатам в некоторых языках (например на Турецком).Удобство чтения
Использование
string.Equals
дает понять, что вы выполняете сравнение.Производительность
string.Equals более эффективен, поскольку ему не нужно создавать новый экземпляр строки, как это делает
ToLower/Upper
.#dotnet #csharp
@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
Почитать больше о предварительной версии 1 и присоединяйтесь к обсуждению на GitHub Discussions: https://github.com/dotnet/core/discussions/9167
#dotnet #csharp
@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
Что произойдет при попытке запуска этого кода?
Anonymous Quiz
25%
Возникнет ошибка компиляции
20%
Возникнет ошибка времени выполения
34%
Выведется "hello world"
20%
Выведется "world hello"
⚡️ DevToys — швейцарский нож для ежедневных задач разработчика.
— Конвертеры: JSON в YAML, парсер Cron’а и тд;
— Кодеры/декодеры;
— Генераторы получения хеша: MD5, SHA1, SHA256, SHA512;
— Работа с текстом: сравнение текстов, разметка, проверка регулярок и тд;
— Работа с графикой: сжатие, конвертирование и тд.
▪Github
@csharp_ci
— Конвертеры: JSON в YAML, парсер Cron’а и тд;
— Кодеры/декодеры;
— Генераторы получения хеша: MD5, SHA1, SHA256, SHA512;
— Работа с текстом: сравнение текстов, разметка, проверка регулярок и тд;
— Работа с графикой: сжатие, конвертирование и тд.
▪Github
@csharp_ci
Эти вызовы не зависят друг от друга.
Вы можете использовать
Task_WhenAll
, чтобы добиться значительного повышения производительности.Это может сделать ваш API в 15 раз быстрее:
▪Читать дальше
▪Последовательное и параллельное выполнение. Task.WhenAll и Task.WhenAny
@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
Шаблон параметров использует классы для обеспечения строго типизированного доступа к группам связанных параметров.
В ASP.NET Core шаблон параметров можно настроить несколькими различными способами. В этой статье показаны некоторые из них и их потенциальные преимущества.
▪Читать
▪Шаблон параметров в ASP.NET Core
@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
💫 Туннели Dev для мобильной разработки
Создавайте уникальные URL-адреса, которые можно использовать для отладки эндпоинтов API, веб-хуков или просто для обмена информацией о вашем проекте.
Dev-туннели для Visual Studio 2022 создают уникальный URL, который можно использовать в мобильных проектах для отладки API. Теперь Visual Studio 2022 позволяет создавать туннели разработчиков одним нажатием кнопки.
▪Читать дальше
@csharp_ci
Создавайте уникальные URL-адреса, которые можно использовать для отладки эндпоинтов API, веб-хуков или просто для обмена информацией о вашем проекте.
Dev-туннели для Visual Studio 2022 создают уникальный URL, который можно использовать в мобильных проектах для отладки API. Теперь Visual Studio 2022 позволяет создавать туннели разработчиков одним нажатием кнопки.
▪Читать дальше
@csharp_ci
Вы практически можете построить свою базу данных документов на его основе 🐘.
▪Пример работы с Marten
▪Github
@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
Открытая книга .NET Lambda Handler Cookbook полностью обновлена до
.NET 8,
включая примеры того, как сделать нативный AOT в ASP NET.Этот проект предоставляет рабочий скелет для работы с AWS Lambda на .NET, включая развертывание с помощью AWS CDK и конвейер GitHub Actions.
▪Github
@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
null
из неасинхронного метода Task/Task<T>
приведет к возникновению NullReferenceException
. Этой проблемы можно избежать, вернув вместо этого Task.FromResult<T>(null)
// неправильно
public Task<object> GetFooAsync()
{
return null; // Noncompliant
}
// правильно так
public Task<object> GetFooAsync()
{
return Task.FromResult<object>(null);
}
+
. Лучше использовать StringBuilder
как более эффективный вариант. // можно быстрее
string str = "";
for (int i = 0; i < arrayOfStrings.Length ; ++i)
{
str = str + arrayOfStrings[i];
}
// это быстрее
StringBuilder bld = new StringBuilder();
for (int i = 0; i < arrayOfStrings.Length; ++i)
{
bld.Append(arrayOfStrings[i]);
}
string str = bld.ToString();
str.Substring(startIndex).IndexOf(char1)
лучше использовать один из методов: IndexOf
IndexOfAny
LastIndexOf
LastIndexOfAny
// так не стоит
str.Substring(StartIndex).IndexOf(char1); // Noncompliant; a new string is going to be created by "Substring"
// более эффективный вариант
str.IndexOf(char1, startIndex);
null
во многих случаях лучше возвращать пустые массивы/коллекции, это делает код понятнее// плохая идея
public Result[] GetResults()
{
return null; // Noncompliant
}
public IEnumerable<Result> GetResults()
{
return null; // Noncompliant
}
// так намного лучше
public Result[] GetResults()
{
return new Result[0];
}
public IEnumerable<Result> GetResults()
{
return Enumerable.Empty<Result>();
}
int
, то результатом всегда будет int
; можно конечно привести этот результат к типу вещественного числа, но из-за проблем с плавающей запятой результат может быть не тем. В общем, лучше привести делимое к (decimal)
: decimal dec = 3/2; // 1
decimal dec = (decimal)3/2; // 1.5
Не стоит забывать эти простые рекомендации, тогда код будет чище и понятее
@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
public class FizzBuzz
{
public static void Main(string[] args)
{
Console.WriteLine(FizzBuzzProgram(350));
}
public static string FizzBuzzProgram(int n) =>
String.Join("\r\n",
Enumerable.Range(1, n).Select(FizzBuzzPipeline));
static readonly Func<int, string?>[] handlers = [(n) => n % 3 == 0 ? "Три" : null, (n) => n % 5 == 0 ? "Пять" : null];
public static string FizzBuzzPipeline(int i) => Counter(i, String.Join("", handlers.Select(f => f(i))));
public static string FizzBuzzPipelinePar(int i)
{
var results = handlers.AsParallel().Select(handler => handler(i)).Where(r => r != null);
return results.Any() ? string.Concat(results) : i.ToString();
}
}
Этот массив расширяемый - пишите хоть 100 проверок, множество других решений на такое не способно.
Можно любое вычисление вычислять. А из-за независимости мы можем запускать их параллельно (если бы вычисление хендлера занимало большое время).
Красота!
Хотите попроще ценой потери части универсальности?
static string FizzBuzzPipelineWOHandlers(int n)
{
string result = $"{(n % 3 == 0 ? "Fizz" : "")}{(n % 5 == 0 ? "Buzz" : "")}{(n % 7 == 0 ? "Qux" : "")}";
return String.IsNullOrEmpty(result) ? n.ToString() : result;
}
Вдохновлено идеями Скотта Влашина, в частности, этим роликом
@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
Что выведет данная программа? А скомпилируется ли она вообще?
var str = new TheBestStructEver(5);
Console.WriteLine(str.A);
public struct TheBestStructEver
{
public int A;
public TheBestStructEver(int a)
{
A = a;
this = new TheBestStructEver();
}
}
❯ Ответ: да, скомпилируется, причем без всяких предупреждений, и выведет 0.
Давайте разберем почему это так. Обратимся к IL-коду нашей структуры, а конкретнее к 12-ой строчке. Вот как она выглядит в IL-коде:
IL_0013: ldarg.0
IL_0014: initobj TheBestStructEver
Итак, первая строчка загружает в стек нулевой аргумент, переданный в метод (конструктор - тоже метод). Аргумент под нулевым индексом - это указатель на объект, в котором мы работаем, то есть
this
. initobj
инициализирует каждое поле структуры нулями или null по адресу, которое лежит у нас первым в стеке (а у нас там лежит указатель на this
). Дополнительно мы еще передаем токен, который указывает тип структуры. Таким образом получается, что у нас вся структура "перезатёрлась нулями" и значение поля A
равно нулю.@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM