В 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
📌 Релиз
#dotnet #sqlserver
@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
Что произойдет если попытаться запустить этот код?
Anonymous Quiz
43%
Object argument
11%
double array argument
37%
Возникет ошибка компиляции
9%
Возникнет ошибка времени выполнения
Эти задачи (с решениями) позволят освоить операторы и базовые конструкции языка C#, потренировать такие навыки программирования, как ввод/вывод данных, целочисленную арифметику, логику и все операторы циклов, ну и не только — есть несколько довольно сложных заданий
@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM