C# (C Sharp) programming
18.7K subscribers
757 photos
38 videos
8 files
676 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
😫 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
🖥 TriviaR

Многопользовательская игра с использованием SignalR и .NET 7

Github

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Debugging Enhancements in .NET 8.

В статье рассказывается о новых функциях отладки в .NET 8.

Обсуждаются улучшения для классов HttpContext, WebApplication, MVC и Razor Pages, а также для gRPC и других инструментов. Теперь можно легко получить доступ к важной информации, используя атрибуты настройки отладки и пользовательские сводки, чтобы отладку

📌Читать

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Изучение расширенных концепций C#

Курс по изучений передовых концепций программирования на языке C#. Этот курс предназначен для повышения квалификации программистов, углубляясь в такие сложные аспекты, как делегаты, события, дженерики, задачи async/await, LINQ, а также .NET. С помощью подробных примеров кода и рекомендаций по применению лучших практик вы изучите шаблоны проектирования, действия пользователя, запросы, операторы, атрибуты C# и многое другое.

Видео
Code

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 EvilSln: Don't open .sln files

Использование различных вредоносных проектов с кодом для фишинговых атак - не новая концепция. В начале 2021 года APT-группа Lazarus использовала специфическую технику атаки в своей кампании, направленной на исследователей безопасности.

Они встраивали вредоносные команды событий в файлы проектов Visual Studio, что позволяло выполнять вредоносный код при компиляции проекта, о чем подробно рассказывается в статье: Новая кампания, направленная на исследователей безопасности.

Этот инцидент в очередной раз привлек внимание общественности к безопасности Visual Studio. Однако важно отметить, что Visual Studio - не единственный продукт, подверженный подобным рискам.

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

В этом репозитории представлена новая техника применения эксплойтов для проектов Visual Studio (по мнению Microsoft, она не является проблемой безопасности) и приведены примеры на C# ее применения.

Цель проекта - повысить осведомленность о потенциальных рисках и дать возможность программистам избежать взлома.

Github

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Почему в C# не следует возвращать коллекции null.

Существуют более эффективные решения.

К каким проблемам приводят нулевые коллекции
Обычно вы выполняете итерации по коллекции в цикле. Но если ваш метод возвращает нулевые коллекции, это может привести к потенциальным ошибкам.

Ваш код должен обрабатывать нулевой случай и проверять наличие null перед обращением к элементам коллекции.

Добавление проверки на null каждый раз может сделать код громоздким и более трудным для понимания.

Еще хуже, если вызывающий код не справляется с таким случаем.

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

Можно возразить, что нулевое значение выражает определенное намерение.

Но я все же предпочитаю по возможности избегать null в своем коде.

Я считаю, что лучше всего возвращать:

- List()
- Enumerable.Empty
- Array.Empty


Таким образом, ваш код может спокойно выполнять итерации по коллекции, не заботясь о проверке на null.
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
🖥 SplatVFX

SplatVFX - это экспериментальная реализация трехмерного гауссова распыления для рендеринга в реальном времени с помощью Unity VFX Graph.

Github
Playground in Unity

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
📒 GigaChat нового поколения.

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

Появился и бот GigaChat в социальной сети «ВКонтакте» — после активации, его можно использовать для самых разных целей: от создания текстов до генерации изображений (за счет интеграции с Kandinsky).

Число уникальных пользователей GigaChat достигло 1 млн.

Попробовать

@data_analysis_ml
🖥 Whisker

Whisker - это инструмент на языке C# для захвата учетных записей пользователей и компьютеров Active Directory путем манипулирования их атрибутом msDS-KeyCredentialLink, эффективно добавляя "теневые учетные данные" к целевой учетной записи.

Для успешного проведения этой атаки в среде должен быть контроллер домена под управлением как минимум Windows Server 2016, а контроллер домена должен иметь сертификат аутентификации сервера, позволяющий проводить аутентификацию PKINIT Kerberos.

⚠️ Disclaimer: Все содержимое данного проекта предназначено только для целей исследования безопасности.

📌 Github

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
Пятничный С# квиз
#ПятничныйКвиз

@csharp_ci
В каком блоке содержится ошибка преобразования типов
Anonymous Quiz
12%
#1
60%
#2
28%
#3