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

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

@ai_machinelearning_big_data - Machine learning

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

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

@pythonlbooks- книги📚

Реестр РКН: https://clck.ru/3Fk3kb
Download 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
Вам когда-нибудь требовалось реализовать полнофункциональный текстовый редактор в вашем приложении C#?

Просто прочтите эту интересную статью по ссылке, где автор представляет текстовый редактор, основанный на классе RichtextBox.
Исходники находятся на сервере Codeproject, мне понадобилось аж три попытки, чтобы их скачать 😲

Надеюсь, скоро автор перенесет этот полезный проект на GitHub, а пока вот ссылка

🔗Статья и проект

@csharp_ci