C# (C Sharp) programming
18.7K subscribers
756 photos
38 videos
8 files
673 links
По всем вопросам- @haarrp

C# - обучающий канал Senior C# разработчика.

@ai_machinelearning_big_data - Machine learning

@itchannels_telegram - 🔥лучшие ит-каналы

@csharp_ci - C# академия

@pythonlbooks- книги📚

Реестр РКН: https://clck.ru/3Fk3kb
Download Telegram
🖥 Что вы предпочитайте string.Equals или ToLower/Upper

В 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
🖥Первая предварительная версия dotnet 9 уже здесь, наряду с обновлениями для #aspnetcore, #dotnetmaui, #efcore и других!

Почитать
больше о предварительной версии 1 и присоединяйтесь к обсуждению на GitHub Discussions: https://github.com/dotnet/core/discussions/9167

#dotnet #csharp

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡️ DevToys — швейцарский нож для ежедневных задач разработчика.

— Конвертеры: 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 шаблон параметров можно настроить несколькими различными способами. В этой статье показаны некоторые из них и их потенциальные преимущества.

Читать
Шаблон параметров в 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
⚡️ Marten - мощная база данных документов и хранилище событий .NET на PostgreSQL

Вы практически можете построить свою базу данных документов на его основе 🐘.

Пример работы с Marten
Github

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
💻 AWS Lambda Handler Cookbook (.NET)

Открытая книга .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
5️⃣простых правил, которые не стоит забывать, чтобы код C# был чище и производительнее

Возврат 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
🖥 Прямо-таки сеньорская версия FizzBuzz — функциональный код с массивом делегатов преобразований числа в Fizz & Buzz.

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
🖥 Новый выпусе- Microsoft .Data.SqlClient 5.2 - с .NET 8, поддержкой пакетной обработки Sql и идентификации рабочей нагрузки + многое другое - смотрите примечания к выпуску:

📌 Релиз

#dotnet #sqlserver

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Отличный сборник заданий и упражнений по C#, поможет освежить самые важные понятия

Эти задачи (с решениями) позволят освоить операторы и базовые конструкции языка C#, потренировать такие навыки программирования, как ввод/вывод данных, целочисленную арифметику, логику и все операторы циклов, ну и не только — есть несколько довольно сложных заданий

📁 PDF

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM