18377
По всем вопросам- @haarrp C# - обучающий канал Senior C# разработчика. @ai_machinelearning_big_data - Machine learning @itchannels_telegram - 🔥лучшие ит-каналы @csharp_ci - C# академия @pythonlbooks- книги📚 Реестр РКН: https://clck.ru/3Fk3kb
🖥 SplatVFX
SplatVFX - это экспериментальная реализация трехмерного гауссова распыления для рендеринга в реальном времени с помощью Unity VFX Graph.
• Github
• Playground in Unity
@csharp_ci
🖥 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
🖥 Изучение расширенных концепций C#
Курс по изучений передовых концепций программирования на языке C#. Этот курс предназначен для повышения квалификации программистов, углубляясь в такие сложные аспекты, как делегаты, события, дженерики, задачи async/await, LINQ, а также .NET. С помощью подробных примеров кода и рекомендаций по применению лучших практик вы изучите шаблоны проектирования, действия пользователя, запросы, операторы, атрибуты C# и многое другое.
• Видео
• Code
@csharp_ci
🙀 Мяу-новость от «Лаборатории Касперского»
Начинается набор на осеннюю оплачиваемую стажировку SafeBoard по направлению Разработка на C#. Если ты живешь в Москве или МО, учишься в вузе или школе 21 и готов(а) работать от 20 часов в неделю, смело запрыгивай в команду и приземляйся сразу на четыре лапы в IT 🐈
Предложение для тебя, если хочешь поработать в крутой команде, которая занимается разработкой платформы и базовой инфраструктуры для тестирования и обновлений, на основе которых строится работа компании. Хорошая зарплата, комфортный офис со спортзалом и сауной, библиотека, игровые и музыкальные комнаты — все будет))
Ты можешь учиться и работать одновременно, прокачать навыки и получить приглашение на работу в Kaspersky после стажировки. Мы принимаем студентов любых университетов и специальностей с 1 курса. Главное — пройти тестирование и собеседование 😎
Прием заявок до 12 октября, не затягивай 🐾
Реклама. АО «ЛАБОРАТОРИЯ КАСПЕРСКОГО» ИНН: 7713140469 erid:LatgC6weq
🖥 TriviaR
Многопользовательская игра с использованием SignalR и .NET 7
• Github
@csharp_ci
🔥 Дайджест полезных материалов из мира C# за неделю
Почитать:
— Принципы ООП в примерах для начинающих
— Наиболее известные улучшения отладки в популярных библиотеках и API .NET:
— 15 лучших бесплатных курсов по Linux
— Передача и обработка IAsyncEnumerable в Typescript с ASP.NET Core Web
— Godot — это не новая Unity. Анатомия вызова API в Godot
— «Ушами Саунд-Дизайнера | Проект 01» — Unity 2D Game Kit + FMOD
— Encapsulamento: O básico que todo jr. precisa saber
— From Converters to Dependency Injection: Navigating Model Migrations
— Game Dev Digest — Issue #206 - Let's Make More Games
— How to upload an Email using the Microsoft Graph API into the Inbox
— How to Redact PDF Documents in .NET using the PDF Library
— 5 ASP.NET Mistakes I Wish I Knew Earlier 🚀
— Pocket Kotlin-C# Dictionary. G
— Pocket Kotlin-C# Dictionary. F
— Custom Event Accessors with Delegates
— Pocket Kotlin-C# Dictionary. E
Посмотреть:
🌐 The Best Feature That Is Not Coming to .NET Anymore (⏱ 07:50)
🌐 How C# 12 Changes Your .NET Classes Forever (⏱ 09:05)
🌐 "One Line of Code Means Clean Code!" - Code Cop #002 (⏱ 09:16)
Хорошего дня!
@csharp_ci
Опрос для опытных ИТ-специалистов.
Поделитесь мнением об ИТ-работодателях. Напишите, что вам нравится, а что — нет. Так компании смогут исправить ошибки, улучшить условия и присылать офферы, на которые хочется соглашаться.
Посмотрите, это займет не больше 10 минут
Sqids - это библиотека, которая генерирует уникальные идентификаторы на основе чисел, похожих на те, что используются в YouTube.
Эти идентификаторы могут быть декодированы обратно в исходные числа.
Sqids предоставляет возможность объединять несколько чисел в одну строку, фильтровать ненормативную лексику, генерировать случайный вывод и обеспечивать высокую производительность. О
➕ совместима с несколькими языками .NET и поддерживает все типы целых чисел в .NET.
📌GitHub
📌Сайт
@csharp_ci
🔥 Дайджест полезных материалов из мира C# за неделю
Почитать:
— Microsoft предлагает БЕСПЛАТНЫЕ онлайн курсы с сертификацией
— Unity: 8 ошибок при использовании Async
— Работа с Gradient через jobs + burst
— Using Memory<T> and Unsafe Code for Memory Manipulation
— Using yield for Deferred Execution
— SIMD aggregate performance
— The Beauty of the Pull Request
— 🎬 Video - Hello World! tutorial on CodeBehind framework
— Plugin Architecture In Blazor – A How To Guide
— Dark Mode With Blazor and Tailwind Css
— Pocket Kotlin-C# Dictionary
— Game Dev Digest — Issue #205 - Back To Work
— Pocket Kotlin-C# Dictionary
Посмотреть:
🌐 Introduction to DateTime in C#: Master the Basics!(⏱ 23:39)
🌐 Do This at the end of Any C Sharp .NET Project! (⏱ 00:38)
🌐 Stop Using Automapper in .NET! (⏱ 09:57)
🌐 The New Way of Calling Your Code in .NET 8 Is INSANE (⏱ 12:34)
Хорошего дня!
@csharp_ci
Вакансии для C#-разработчиков в Ozon Tech
Привет! Это команда rFBS Ozon Tech. Мы развиваем формат взаимодействия Ozon с продавцами, при котором они сами хранят, формируют и доставляют заказы. А Ozon работает как витрина с десятками миллионов лояльных клиентов. Мы хотим порадовать пользователей новыми фичами уже в этом сезоне распродаж.
Такую задачу непросто решить без сильной команды, поэтому мы в поисках middle/senior C#-разработчиков.
📌Наш проект — это:
— Работа в одной из самых быстрорастущих вертикалей Ozon,
— Высокие нагрузки до 300k rps,
— Архитектурные вызовы в контексте масштабируемости сервисов,
— Быстрый time-to-market,
— Возможность работать из офисов России и Казахстана / удалённо / гибридно.
Наш стек: .NET 6-7, ASP.NET Core, PostgreSQL, Kafka, gRPC, EF Core, Dapper.
Узнать подробности о проекте, вакансиях, бенефитах и откликнуться можно на этом лендинге.
Давайте менять рынок e-com вместе!
🔥 Дайджест полезных материалов из мира C# за неделю
Почитать:
— Идея небольшого дополнительного механизма для контейнера внедрения зависимостей
— Вещественные числа с плавающей двоичной точкой в .NET и .NET Framework
— Магия степеней двойки, или Запуск кучи docker контейнеров
— Сборка .NET решений через код на Nuke Build
— The Power of Convention
— Visual Studio Appsettings.json schemas
— Crafting an Item-Spawn System
— Learn2Blog
— How To Work With The Browser's Local Storage in Blazor
— ASP.NET Core VS CodeBehind
— Game Dev Digest — Issue #204 - 2 Minutes To Midnight
— SQL-Server insert record get primary key back
— C# Intrepid Voyage: 10 Strategies to Master the Language
— Unit of Work, Repositories Pattern, and Fluent Validation in Dotnet Core Web API 🛠️"
Посмотреть:
🌐 The "Terrible" Keyword You Didn’t Know C# Had (⏱ 09:09)
🌐 Why Startups Hate .NET and C# (⏱ 10:38)
Хорошего дня!
@csharp_ci
🖥 Как обеспечить соблюдение правил архитектуры программного обеспечения?
Архитектурные тесты.
Это автоматизированные тесты, проверяющие структуру и дизайн кода.
С их помощью можно обеспечить соблюдение правил проектирования, выраженных в коде C#.
- Определить все зависимости проекта
- Определить нейминг классов
- Использовать изолированные классов
Представьте себе, что затраты на реализацию архитектуры вашего программного обеспечения сведены к нулю.
Вот что могут дать вам архитектурные тесты.
ArchUnitNET - это бесплатная, простая библиотека для проверки архитектуры кода на C#.
@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
⚡ Introducing the Identity API endpoints
В этой статье рассматривается новый функционал ASP.NET Core Identity, добавляемый в .NET 8 в виде API, которые можно использовать для выполнения базовых операций идентификации, таких как регистрация пользователей.
Эти конечные точки служат удобными альтернативами "стандартному пользовательскому интерфейсу", который уже некоторое время доступен в ASP.NET Core Identity.
В статье показно, как использовать эти API для взаимодействия с защищенными API в вашем приложении.
📌Читать
@csharp_ci
Пятничный 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);
🖥 Почему в C# не следует возвращать коллекции null.
Существуют более эффективные решения.
К каким проблемам приводят нулевые коллекции
Обычно вы выполняете итерации по коллекции в цикле. Но если ваш метод возвращает нулевые коллекции, это может привести к потенциальным ошибкам.
Ваш код должен обрабатывать нулевой случай и проверять наличие null перед обращением к элементам коллекции.
Добавление проверки на null каждый раз может сделать код громоздким и более трудным для понимания.
Еще хуже, если вызывающий код не справляется с таким случаем.
Во время выполнения программы произойдет ошибка, которую нелегко диагностировать.
Можно возразить, что нулевое значение выражает определенное намерение.
Но я все же предпочитаю по возможности избегать null в своем коде.
Я считаю, что лучше всего возвращать:- List()
- Enumerable.Empty
- Array.Empty
Таким образом, ваш код может спокойно выполнять итерации по коллекции, не заботясь о проверке на null.
🔥 Дайджест полезных материалов из мира C# за неделю
Почитать:
— ГЕОМЕТРИЯ ЗВУКА
— Обзор библиотек для Hangfire
— Нодовая архитектура на Unity
— Пять забавных странностей в коде Entity Framework Core
— Особенности национальной автоматизации
— Многопоточность в Photon Plugin
— Working With the Path Static Class in C#
— Unity game architecture Part 2
— Game Dev Digest — Issue #208 - Publishing Your Game, And More
— WPF App Modernisation: A Pragmatic Approach
— 5 amusing oddities in the code of Entity Framework Core
— How to Scan Barcode in C# (Developer Tutorial)
— Interface Proxy
— How to Make Sure Your Test Resources Are Always Available
— Lessons learned from building a static code analyzer for C#
— .NET Core Interview Question & Answers
Посмотреть:
🌐 Understand the .NET Support Lifecycle (⏱ 00:57)
🌐 "Don't Use Fields in C#! Use Properties Instead" | Code Cop #003 (⏱ 10:27)
🌐 The Testing Technique Everyone Should Use in .NET (⏱ 09:56)
🌐 Chatgpt, Bard , Claude, Theb - используй API лучших нейросетей бесплатно и без ВПН(⏱ 05:23)
Хорошего дня!
@csharp_ci
🖥 Debugging Enhancements in .NET 8.
В статье рассказывается о новых функциях отладки в .NET 8.
Обсуждаются улучшения для классов HttpContext, WebApplication, MVC и Razor Pages, а также для gRPC и других инструментов. Теперь можно легко получить доступ к важной информации, используя атрибуты настройки отладки и пользовательские сводки, чтобы отладку
📌Читать
@csharp_ci
🔥 Дайджест полезных материалов из мира C# за неделю
Почитать:
— «Чистый» код, нет проблем с производительностью. (плюс анекдот)
— Модульные механики на Unity
— Contributing to More Open-Source Repos
— Game Dev Digest — Issue #207 - Improving Fun, Performance And More
— Building a Basic RESTful API with ASP.NET Core
— LiteDB: Um banco de dados NoSQL simples e poderoso para dotnet!
— Blazor RenderFragment – How To Use Plugins To Generate HTML
— Simplify Unit Tests by Storing Complex Data in Resource Files
— Converting Excel XLSX to PDF with C# .NET
— How I Keep My Animator Controllers Organized
— OPTIONS PATTERN IN .NET 6
— C# - Parallel Programming with async and await for Concurrent Execution
Посмотреть:
🌐 Why Do Older .NET Developers Hate Modern .NET? (⏱ 10:14)
🌐 The Common Entity Framework Mistake You MUST Fix (⏱ 10:03)
Хорошего дня!
14 октября пройдёт One Day Offer, какого у тебя ещё не было!
Ozon Tech приглашает C#-разработчиков на семейный One Day Offer. В программе интерактивы для взрослых и юных гостей, а ещё финальные интервью для кандидатов. Можно присутствовать и онлайн, но в офисе интереснее.
Какой план:
✅ оставь заявку на участие;
✅ пройди предварительное интервью;
✅ познакомься с тимлидами онлайн;
✅ получи приглашение на One Day Offer 14-го октября, где пройдёт финальное собеседование (офлайн/онлайн).
Успей подать заявку до 9 октября🔥
Оставить заявку
🖥 История C# ⬇
Отличная статья на сайте MS learn, в которой рассматривается эволюция #csharp от версии к версии.
Очень понравилось читать.
Рекомендую
📌 Читать
@csharp_ci
📌 Встроенная поддержка контейнеров для .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;http://localhost:5033",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
Так API всегда запустится на безопасном порте 7290 и HTTP-порте 5033. Внимание: только для запуска приложения на компьютере разработчика, а не в контейнере Docker.
По умолчанию, когда контейнер Docker развертывается с образом .NET, приложение запускается в http://+:80.
Чтобы переопределить его на другой номер порта в контейнере Docker, устанавливаем эту переменную окружения:
📌 Читать
@csharp_ci
Привет! Мы в МТС активно поддерживаем ИТ-сообщество в России и запускаем всероссийскую олимпиаду по программированию с главным призом в 3 млн рублей.
Для кого? Для школьников, студентов и действующих ИТ-специалистов.
Что будет? Блок онлайн-заданий, митапы и мастер-классы, общение в закрытом Telegram-канале и финальный очный тур с программированием на скорость. Когда олимпиада завершится, мы создадим True Tech Community, где будем делиться полезными и эксклюзивными материалами для разработчиков.
А что еще? Финалистов ждет afterparty, фестиваль технологий, интерактив, квесты, карьерные стенды, где лучшие специалисты смогут получить оффер от МТС.
Регистрация уже открыта! Подробности по ссылке. Ждем тебя!
Реклама. ПАО "МТС". ИНН 7740000076. erid: LjN8K7znt
😫 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);
}
}
Выглядит надёжно, не так ли? На самом деле нет.
📌Разберем
🖥 Бесплатный курс. Напишите свой первый код на языке C#
Изучите базовый синтаксис и процессы, необходимые для создания простых приложений на языке C#.
📌 Курс
@csharp_ci
🔐 Steam Desktop Authenticator
Десктопная реализация мобильного приложения аутентификатора Steam на C#.
• Github
@csharp_ci
🔥 Дайджест полезных материалов из мира: C# за неделю
Почитать:
— Инструменты создания API клиента для .NET
— Отслеживание изменения температуры в помещении при помощи ультразвука
— 9 лучших консольных файловых менеджеров Linux
— Использование MassTransit (RabbitMQ) в ASP.NET Core
— Осторожно: ICacheEntry
— The key new features and changes in .NET 8
— Validation in Elanat
— Game Dev Digest — Issue #203 - Simulations, Patterns, VR and more
— Get images from resources in Windows Forms
— Building a Contact Form with Microsoft Azure and Blazor
— How to Convert a Word Document into Images Using the Syncfusion Word Library
— Multi-Tenant SaaS Architecture with Entity Framework
— Training of components in Elanat core
— How to install Elanat CMS
— Evolution of C# (videos)
— Power your .NET REST API with data queries and reports
Посмотреть:
🌐 Reviewing Bad LinkedIn C# Advice (⏱ 10:32)
🌐 The Weirdest Bug Your C# Code Has Right Now (⏱ 07:04)
Хорошего дня!
@csharp_ci
*** ну как уже зарабатывать на этих играх?
Очень просто. Идешь на ПОСЛЕДНИЙ бесплатный в этом году онлайн-интенсив по геймдеву от Евгения Гришакова, основателя студии Garden of Dreams с оборотом почти миллион долларов, и делаешь свои деньги!
Сейчас очень сложно подняться в IT, везде нужен гигантский опыт, а конкуренция просто огромная. Геймдев в этом плане проще: здесь есть четкая стратегия, как на этом зарабатывать.
Просто переходи по ссылке и регистрируйся на бесплатное обучение по геймдеву. А за регистрацию, кстати, можно получить крутые подарки, в том числе бесплатный исходник игры.
🔥 Дайджест полезных материалов из мира : C# за неделю
Почитать:
— Как приручить автотестового монстра, или Dependency Injection в автотестах
— Книги по C# для начинающих и практикующих специалистов
— Ad-hoc-полиморфизм и паттерн type class в C#
— Путь к Инновационному Тестированию с Selenium и C#: Мастерство и Качество
— Saia do loop #1 - Hello World em C#
— Announcing Appwrite’s New .NET SDK
— Game Dev Digest — Issue #202 - Clean Code
— Fluent Validation or Data Annotations in C# – Which Is Better?
— Rest Api Using C#, Dotnet, Docker, Entity Framework and Azure Data Studio
— Setting up VS Code for C# development
— Elanat 2 on the GitHub.
— Anti-patterns that every developer should know
— Method Syntax vs. Query Syntax in C# LINQ: Unveiling the Differences, Pros, and Cons
— What Alternatives Are There to Use in Unit Tests Instead of Mocks?
Посмотреть:
📌The Smart Way of Using the Decorator Pattern in C#
📌Марк Шевченко — Пишем функционально на C# и F#Доклад на русском
Хороших выходных !
@csharp_ci
✨ 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