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

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

@ai_machinelearning_big_data - Machine learning

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

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

@pythonlbooks- книги📚

Реестр РКН: https://clck.ru/3Fk3kb
Download Telegram
🖥 Вопросы и ответы на собеседовании по C# многопоточности

В этой статье вы найдете полную подборку вопросов для собеседования по многопоточности C#, которые не только проверят ваше знание предмета, и обеспечат хорошую подготовку к следующему техническому собеседованию.

📌 Читать

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Хотите бесплатно изучить чистой архитектуры?

Первое, что необходимо понимать — приложения, созданные с помощью принципов чистой архитектуры, обладают высокой устойчивостью к изменениям. Они быстро адаптируются к новым требованиям и возможностям, сохраняя при этом высокое качество кода и производительность. Кроме того, система становится гораздо проще для понимания и сопровождения, что делает ее более доступной для других разработчиков.

Принципы чистой архитектуры также помогают избежать проблем с зависимостями и разделить приложение на логические блоки. Это повышает удобство добавления новых функций и изменения уже существующих. В результате, время разработки сокращается, а приложение становится более гибким и масштабируемым.

Какие преимущества могут дать принципы Clean Architecture :

Улучшение качества кода;

Быстрая адаптация к изменениям и новым функциям;

Удобство сопровождения и расширения приложений;

Минимизация проблем с зависимостями;

Повышение гибкости и масштабируемости приложений;

Сокращение времени разработки и улучшение производительности.

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

Представляем вам список из 45 полезных уроков, разбитых по темам.🔥

𝗖𝗹𝗲𝗮𝗻 𝗔𝗿𝗰𝗵𝗶𝘁𝗲𝗰𝘁𝘂𝗿𝗲 𝗙𝘂𝗻𝗱𝗮𝗺𝗲𝗻𝘁𝗮𝗹𝘀
- Project setup
- Minimal APIs - https://youtu.be/GCuVC_qDOV4
- Dependency injection - https://youtu.be/tKEF6xaeoig
- CA + Document database - https://youtu.be/Ru6_b50wdfo
- Project setup from scratch - https://youtu.be/fe4iuaoxGbA
- 4 Best practices for new project - https://youtu.be/B9ZUJN1Juhk
- Structured logging - https://youtu.be/nVAkSBpsuTk
- Message queues - https://youtu.be/CTKWFMZVIWA

𝗗𝗼𝗺𝗮𝗶𝗻-𝗗𝗿𝗶𝘃𝗲𝗻 𝗗𝗲𝘀𝗶𝗴𝗻 𝗜𝗻𝘁𝗿𝗼𝗱𝘂𝗰𝘁𝗶𝗼𝗻

- Rich Domain model - https://youtu.be/1Lcr2c3MVF4
- Entities - https://youtu.be/00tCda35Bvk
- Value objects - https://youtu.be/P5CRea21R2E
- Aggregate root - https://youtu.be/0D3EB2jvQ44
- Domain validation - https://youtu.be/KgfzM0QWHrQ
- Domain model tradeoffs - https://youtu.be/eC7GMGIR4Gw
- Repository pattern - https://youtu.be/h4KIngWVpfU
- Specification pattern - https://youtu.be/rdY5ElleWKY
- Unit of work - https://youtu.be/vN_j1Bs0ALU
- Smart Enums - https://youtu.be/v6cYTcEfZ8A
- Snapshot pattern - https://youtu.be/HhZ4DtON404
- Strongly typed IDs - https://youtu.be/LdrMdIabE1o
- Anemic Domain model - https://youtu.be/6gwIDiUk2h4
- DDD modeling - https://youtu.be/fO2T5tRu3DE
- DDD + EF mapping - https://youtu.be/IlXnIe6p_Uk
- Incomplete aggregates - https://youtu.be/cCnZJE0wEjY
- Double dispatch - https://youtu.be/wi_wsw5Gp6Q

𝗖𝗤𝗥𝗦

- CQRS Fundamentals - https://youtu.be/vdi-p9StmG0
- Validation /w Result - https://youtu.be/85dxwd8HzEk
- Validation /w Exception - https://youtu.be/OhQA4PDdp0Q
- Read models - https://youtu.be/AVBAAKa84cs
- UoW pipeline - https://youtu.be/sSIg3fpflI0
- The "Truth" on CQRS - https://youtu.be/F3xNCfP3Xew
- CQRS Query side - https://youtu.be/RgqCavV2cqQ
- Materialized views - https://youtu.be/2ZNMlx44gKQ

𝗧𝗲𝘀𝘁𝗶𝗻𝗴
- Parameterized tests - https://youtu.be/Pk2d-qm5KwE
- Unit testing - https://youtu.be/a6Qab5l-VLo
- Integration testing /w Docker - https://youtu.be/tj5ZCtvgXKY
- Architecture tests - https://youtu.be/_D6Kai4RdGY

𝗗𝗲𝘀𝗶𝗴𝗻 𝗣𝗮𝘁𝘁𝗲𝗿𝗻𝘀
- Idempotent consumer - https://youtu.be/mGeEtokcjVQ
- Saga pattern - https://youtu.be/dlXCodLxhag
- Compensating transaction (Saga) - https://youtu.be/FPVzevl6Ri8
- Domain events - https://youtu.be/AHzWJ_SMqLo
- Domain vs. Integration event - https://youtu.be/K806a-rWE2g
- Options pattern - https://youtu.be/wxYt0motww0
- Options pattern validation - https://youtu.be/qRruEdjNVNE
- Decorator pattern - https://youtu.be/i_3I6XLAOt0

@csharp_ci
🖥 Изучаем базы данных

Большой сборник теоретического материала по работе с базами данных.

основы: https://phpclub.ru/mysql/doc/tutorial.html

отношения между таблицами в БД: https://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix-chast-3.html

внешние ключи: https://denis.in.ua/foreign-keys-in-mysql.htm

большой учебник по SQL: https://www.pyramidin.narod.ru/rusql/index.htm

sql канал с практичесикми задачами: @sqlhub

сборник запросов на все случаи жизни (англ): https://www.artfulsoftware.com/infotree/queries.php

таблицы отличий в диалектах SQL в разных СУБД (англ): https://en.wikibooks.org/wiki/SQL_dialects_reference

манга-учебник про SQL в картинках: https://www.nostarch.com/mg_databases.htm

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
Ad-hoc-полиморфизм и паттерн type class в C#

Что такое ad-hoc-полиморфизм, какие проблемы он решает и как вообще его реализовать, используя паттерн type class на языке программирования C#? ⬇️

▍ Виды полиморфизмов

Оказывается, что полиморфизмов есть, как минимум, три вида:

1. Параметрический.
2. Специальный (ad-hoc).
3. Полиморфизм подтипов.

Начнём с параметрического полиморфизма. Допустим, у нас есть список элементов. Это может быть список целых чисел, чисел с плавающей запятой, строк, чего угодно. Теперь представьте метод GetHead(), который возвращает первый элемент из этого списка. Для него не важно, является ли возвращаемый элемент типом int, string, Apple или Orange. Его возвращаемый тип — это формальный типовой параметр, стоящий вместо T внутри IList<T>, и его реализация одинакова для всех типов: «вернуть первый элемент».

interface IList<T>
{
T GetHead();
}


В отличие от параметрического полиморфизма, специальный полиморфизм привязан к типу. В зависимости от него вызываются разные реализации метода. Перегрузка методов — один из примеров ad-hoc-полиморфизма. Например, можно иметь две версии метода, присоединяющего первый элемент ко второму — одну, которая принимает два целых числа и складывает их, и другую, которая принимает две строки и конкатенирует их. Вы знаете, что 2 + 3 = 5, но "2" + "3" = "23".

class Appender
{
public int AppendItems(int a, int b) =>
a + b;

public string AppendItems(string a, string b) =>
$"{a}{b}";
}


При полиморфизме подтипов дочерние классы предоставляют разные реализации метода некоторого базового класса. В отличие от специального полиморфизма, где решение о том, какая реализация вызывается, принимается на этапе компиляции (раннее связывание), в полиморфизме подтипов оно принимается во время выполнения (позднее связывание).

abstract class Animal
{
public abstract int GetMeatMass();
}

class Cow : Animal
{
public override int GetMeatMass() => 20;
}

class Dog : Animal
{
public override int GetMeatMass() => 5;
}


Теперь давайте ближе рассмотрим ad-hoc-полиморфизм, два других рассматривать подробно в этот раз не будем.

📌 Читать дальше

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
Пятничный C# квиз:
Foo foo = new Foo();
Bar bar = new Bar();
Baz baz = new Baz();

Console.WriteLine($"{foo.a}, {bar.a}, {baz.a}");


record struct Foo(int a = 10);
struct Bar
{
public Bar(int a = 10)
{
this.a = a;
}

public int a { get; }
}
record class Baz(int a = 10);
Что выведет на экран код выше?
Anonymous Quiz
56%
10, 10, 10
6%
0, 0, 0
13%
0,0,10
10%
0,10, 0
16%
10,0,10
Introducing the Identity API endpoints

В этой статье рассматривается новый функционал ASP.NET Core Identity, добавляемый в .NET 8 в виде API, которые можно использовать для выполнения базовых операций идентификации, таких как регистрация пользователей.

Эти конечные точки служат удобными альтернативами "стандартному пользовательскому интерфейсу", который уже некоторое время доступен в ASP.NET Core Identity.

В статье показно, как использовать эти API для взаимодействия с защищенными API в вашем приложении.

📌Читать

@csharp_ci
SyntheticHumans Package (Unity Computer Vision)

A package for creating Unity Perception compatible synthetic people.

Модель для генерации людей, обученная на большом наборе антропоцентрических измерений, которая способна генерировать широкий спектр форм и поз человеческого тела.


🖥 Github: https://github.com/Unity-Technologies/com.unity.cv.synthetichumans

📂 AnthroNet: https://github.com/Unity-Technologies/AnthroNet

📕 Paper:https://arxiv.org/abs/2309.03812v1

⭐️ Dataset: https://paperswithcode.com/dataset/unity-synthetic-humans

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Как обеспечить соблюдение правил архитектуры программного обеспечения?

Архитектурные тесты.

Это автоматизированные тесты, проверяющие структуру и дизайн кода.

С их помощью можно обеспечить соблюдение правил проектирования, выраженных в коде C#.

- Определить все зависимости проекта
- Определить нейминг классов
- Использовать изолированные классов

Представьте себе, что затраты на реализацию архитектуры вашего программного обеспечения сведены к нулю.

Вот что могут дать вам архитектурные тесты.

ArchUnitNET - это бесплатная, простая библиотека для проверки архитектуры кода на C#.

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔐 Steam Desktop Authenticator

Десктопная реализация мобильного приложения аутентификатора Steam на C#.

Github

@csharp_ci
🖥 Бесплатный курс. Напишите свой первый код на языке C#

Изучите базовый синтаксис и процессы, необходимые для создания простых приложений на языке C#.

📌 Курс

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
😫 Unity: 8 ошибок при использовании Async

1. Use UniTask instead of Task
И первым пунктом будет рекомендация. Но эта рекомендация может уберечь от множества ошибок в дальнейшем. Заключается она в использовании UniTask вместо стандартного Task.

И так, помимо такого преимущества, как zero allocation, UniTask работает на основном потоке Unity, как и coroutine.

Да, это не та асинхронность, которую нам предлагает Task с его потоками, но в большинстве случаев этого достаточно. К тому же нам никто не мешает использовать комбинацию этих подходов при необходимости.

Какие же преимущества нам даёт работа на основном потоке?

Помимо таких очевидных, как вызов Unity API из async методов и работа в WebGL, есть два ключевых.
✔️ Первый – UniTask не "скрывает" исключения, возникшие в async методах при неправильном их вызове, как это делает Task.
✔️ Второй и самый важный – это невозможность получить взаимную блокировку «deadlock».

Резюмируя, UniTask минимизирует вероятность выстрелить себе в ногу при работе с async/await в Unity.

2. Async void
Давайте теперь разбираться с ошибками. И начнём мы с неустаревающей классики async void.

Так чем же плох следующий метод?

public async void SomeMethod()
{
// Async operation.
}

Самая большая проблема приведённого кода в том, что если кто-то захочет вызвать метод SomeMethod() он даже и не узнает, что это асинхронный метод, пока не посмотрит его реализацию.
И даже IDE об это не скажет.

Отсюда и вытекает первая проблема. Допустим, мы хотим обезопасить себя от исключений, которые могут возникнуть в методе SomeMethod(). Для этого мы оборачиваем его вызов в блок try/catch.

private void Awake()
{
try
{
_class.SomeMethod();
}
catch (Exception e)
{
Debug.LogError(e.Message);
}
}

Выглядит надёжно, не так ли? На самом деле нет.

📌Разберем
Please open Telegram to view this post
VIEW IN TELEGRAM
Sqids - это библиотека, которая генерирует уникальные идентификаторы на основе чисел, похожих на те, что используются в YouTube.

Эти идентификаторы могут быть декодированы обратно в исходные числа.

Sqids предоставляет возможность объединять несколько чисел в одну строку, фильтровать ненормативную лексику, генерировать случайный вывод и обеспечивать высокую производительность. О

совместима с несколькими языками .NET и поддерживает все типы целых чисел в .NET.

📌GitHub
📌Сайт

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
📌 Встроенная поддержка контейнеров для .NET 7 — контейнеризация приложений .NET без Dockerfile

Основная идея
Каков общий рабочий процесс большинства программных приложений, особенно микросервисов?

Код → отправка в репозиторий → запуск конвейера непрерывной интеграции и непрерывного развертывания. Часть этого конвейера — этап сборки Docker, на котором из длинного Dockerfile обычно считываются данные и генерируются образы Docker для приложения. → И, наконец, развертывание образа в службе облачных вычислений.

Теперь не нужно сопровождать Dockerfile: образ генерируется самим фреймворком .NET и отправляется в выбранный репозиторий.

Далее мы узнаем, как собираются образы Docker при помощи инструментария интерфейса командной строки .NET, изучим предоставляемые им варианты, сравним с подходом Dockerfile и интегрируем в рабочий процесс Github Actions, продемонстрировав полезность этого для ваших проектов.

Сначала быстро рассмотрим контейнеризацию приложения .NET 6 с Dockerfile.

Создадим два простых приложения: dotnet6 и dotnet7. Поместим их код в папки одного репозитория. А в конце покажем, как это интегрировать с конвейером сборки и отправляемым, например, на DockerHub образом, и прямо в GitHub напишем простой рабочий процесс GitHub Actions.

Устанавливаем оба SDK-пакета и Docker Desktop:

Первый.
Второй.
Docker Desktop.

Создаем на GitHub репозиторий, клонируем его на компьютер для локальной разработки, при помощи Visual Code открываем папку репозитория и добавляем здесь папку dotnet6.

Вот исходный код этой реализации.

Контейнеризация приложений .NET 6 — вкратце
В папке dotnet6 создаем простой веб-API проект HelloDocker на .NET 6, запуская команду dotnet интерфейса командной строки:
dotnet new webapi --name HelloDocker --framework net6.0

Здесь указывается на TargetFramework, то есть целевой фреймворк net6.0.

ПРОПУСТИТЕ ЭТУ ЧАСТЬ, ЕСЛИ УЖЕ ХОРОШО ЗНАЕТЕ КОНТЕЙНЕРИЗАЦИЮ ПРИЛОЖЕНИЙ ДО ВЕРСИИ .NET 6 ВКЛЮЧИТЕЛЬНО.

Это очень простой веб-API, которым возвращаются стандартные данные о погоде, подобный любому другому новому веб-API проекту по умолчанию на ASP.NET Core. Чтобы его контейнеризировать, до версии .NET 7 в корневой каталог проекта добавляли Dockerfile.

Совет: создав любое приложение dotnet, сразу очистить файл «launchSettings.json» и удалить все конфигурации, связанные со службами информационного сервера интернета IIS.
{
"$schema": "https://json.schemastore.org/launchsettings.json",
"profiles": {
"HelloDocker": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": false,
"launchUrl": "swagger",
"applicationUrl": "https://localhost:7290;https://localhost:5033",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

Так API всегда запустится на безопасном порте 7290 и HTTP-порте 5033. Внимание: только для запуска приложения на компьютере разработчика, а не в контейнере Docker.

По умолчанию, когда контейнер Docker развертывается с образом .NET, приложение запускается в https://+:80.

Чтобы переопределить его на другой номер порта в контейнере Docker, устанавливаем эту переменную окружения:

📌 Читать

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 История C#

Отличная статья на сайте MS learn, в которой рассматривается эволюция #csharp от версии к версии.

Очень понравилось читать.

Рекомендую

📌 Читать

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