18377
По всем вопросам- @haarrp C# - обучающий канал Senior C# разработчика. @ai_machinelearning_big_data - Machine learning @itchannels_telegram - 🔥лучшие ит-каналы @csharp_ci - C# академия @pythonlbooks- книги📚 Реестр РКН: https://clck.ru/3Fk3kb
🦾Хардкорный тест по языку С🦾
📌Пройдите полный тест из 20 вопросов на сайте и проверьте, насколько вы готовы к обучению на углубленном курсе - «Программист С» от OTUS.
Сможете сдать - пройдете на курс с финальной скидкой 10% по промокоду devc10
⏰ Время прохождения теста ограничено 30 минут
👉ПРОЙТИ ТЕСТ
erid: LjN8K3218
❓Как С#-разработчику вырасти до уровня Senior в 2024?
Изучить .NET Framework, Scrum-методики и многое другое на онлайн-курсе «C# Developer. Professional» от OTUS.
Программа идеально подходит для начинающих C#-разработчиков, которые хотят развиваться в серверной разработке, создании приложений и микросервисов.
На курсе вас ждут:
- живые вебинары с возможностью задать вопросы экспертам;
- много практики и сильные проекты для портфолио;
- поддержка профессионального комьюнити.
👉 Пройдите бесплатный тест прямо сейчас и узнайте, готовы ли вы сделать следующий шаг в карьере: https://otus.pw/SXyf/
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
Сможете разгадать тайны Гиперкуба?
Проявите смекалку и примените ИТ-скиллы на Tinkoff CTF — соревновании по спортивному хакингу. Победителям — призы до 420 000 ₽. Вот как все устроено:
— Выберите лигу: опытных или новых игроков. Задания рассчитаны на ИТ-специалистов уровня мидл и выше. Если играете впервые, можете потренироваться с демоверсией заданий.
— Соревнуйтесь в одиночку или командой до трех человек. Организаторы помогут найти команду, если нет своей.
— Играйте онлайн или офлайн — в одном из 16 городов России, Беларуси и Казахстана.
— Используйте время на решение заданий или общение с участниками — у вас будет 36 часов.
Задания будут интересны разработчикам, QA- и SRE-инженерам, аналитикам и другим опытным ИТ-специалистам.
Зарегистрируйтесь до 19 апреля и пробуйте свои силы
erid:2VtzqwMPLoX
Реклама. АО "Тинькофф Банк", ИНН 7710140679, лицензия ЦБ РФ № 2673
Ozon Tech приглашает на C#-митап
29 марта | 19:00
Офлайн в Москве | Онлайн
Какие темы в программе?
#️⃣ ThreadPool, выявление проблем при работе на высоких нагрузках, Алексей Калдузов, руководитель группы разработки C#-платформы.
#️⃣ Причины медленной работы БД и способы оптимизации на примере PostgreSQL, Дмитрий Орлов, эксперт разработки, команда Metazon Inventory.
#️⃣ Решение проблем шардированных БД, Артём Барабошин, старший C#-разработчик.
А после докладов — уютный вечер за разговорами🍕
Зарегистрируйтесь, чтобы получить офлайн-билет или присоединиться к трансляции.
erid: LjN8Jtu2A
Реклама. Рекламодатель ООО «Озон Технологии».
🖥 Ловите полезные ссылки для изучения асинхронности в C#
Асинхронность вызывает большие проблемы у многих, но выход есть — вот:
*️⃣ Во-первых, стоит прочитать весь блок статей на MSDN
*️⃣ Первый гигант async/await — Stephen Cleary. Вводная статья
*️⃣ Статья об устройстве async/await под капотом. Не обязательно заучивать всю машину состояний под await, но тут как с блоком итератора yield - код пишется, а руки трясутся.
*️⃣ На этом этапе может начаться каша в голове и встреча с SynchronizationContext. Начать можно с этой статьи на MSDN. Но если она покажется душной, переходите к пункту 5.
*️⃣ Второй гигант, и тоже Stephen. Я советую перечитать все статьи обоих, что можно найти. Но продолжая тему контекста синхронизации — эта статья крайне важна для тех, кто тренируется в консольных приложениях. Вопрос об асинхронности/многопоточности уходит после нее. И небольшой, но классный ответ на StackOverflow о TaskScheduler.
*️⃣ Но если вопрос все же не ушел — There is no thread. Также советую загуглить словосочетание из этой статьи — naturally-asynchronous operations.
*️⃣ Для закрепления пунктов 4,5,6 можно почитать о Task.Run (и комплексных случаях использования многопоточности и асинхронности). Внутри этого блока статей много полезных ссылок и на другие материалы.
*️⃣ Лучшие практики от Cleary. Кстати, у него есть книга по асинхронности, можно ознакомиться при желании.
*️⃣ Обработка исключений.
@csharp_ci
🖥 Humanizer C#
Humanizer — бесплатная .NET-библиотека с открытым исходным кодом, которая предлагает набор методов для манипулирования строками, числами, датами, временем, временными интервалами, цифрами и величинами в удобном для человеческого восприятия виде.
Работа со временем и датой — одна из самых распространенных и муторных задач в любом приложении. Пользователи ожидают увидеть дату и время в формате, который будет легко восприниматься и соответствовать контексту.
🔵Форматирование DateTime в удобочитаемый вид
Один из самых простых способов гуманизировать объект DateTime — использовать метод расширения Humanize, который возвращает время и дату на естественном языке. Например:
using Humanizer;
DateTime now = DateTime.Now;
DateTime yesterday = now.AddDays(-1);
DateTime tomorrow = now.AddDays(1);
DateTime nextWeek = now.AddDays(7);
Console.WriteLine(now.Humanize()); // сейчас
Console.WriteLine(yesterday.Humanize()); // вчера
Console.WriteLine(tomorrow.Humanize()); // через 23 часа
Console.WriteLine(nextWeek.Humanize()); // через 6 дней
Humanize возвращает строку, которая легко воспринимается и зависит от текущих времени и даты. Он также учитывает различные временные отношения, такие как сегодня, вчера, завтра, а также будущие или прошлые даты.DateTime — использовать метод расширения Humanize с булевым параметром, указывающим, отображать относительное время или нет. Относительное время — это строка, которая представляет, сколько времени прошло с или пройдет до конкретного момента. Например:
using Humanizer;
DateTime anHourAgo = DateTime.Now.AddHours(-1);
DateTime anHourLater = DateTime.Now.AddHours(1);
Console.WriteLine(anHourAgo.Humanize()); // час назад
Console.WriteLine(anHourLater.Humanize()); // через 59 минут
🖥 Как распарсить HTML в .NET?
🔜 Итак, реальный кейс:
Необходимо извлечь все URL из атрибутов href тегов a в HTML странице. Можно попробовать воспользоваться регулярными выражениями:
Uri uri = new Uri("http://google.com/search?q=test");
Regex reHref = new Regex(@"<a[^>]+href=""([^""]+)""[^>]+>");
string html = new WebClient().DownloadString(uri);
foreach (Match match in reHref.Matches(html))
Console.WriteLine(match.Groups[1].ToString());null, а не выброшено исключение), но разработчик в конце концов сдался и исправил самые жуткие костыли. Что-то ушло само, например, Microsoft BCL Portability Pack. Что-то осталось, например, пространства имён очень гранулярные, даже базовое использование библиотеки требует три using и т. п.), но в целом ничего критичного.IHtmlDocument angle = new HtmlParser().ParseDocument(html);
foreach (IElement element in angle.QuerySelectorAll("a"))
Console.WriteLine(element.GetAttribute("href"));
Смартфон за ваш ответ!
Исследовательская компания OMI проводит опрос среди IT-специалистов.
Пройдите по ссылке, ответьте на несколько вопросов и получите шанс выиграть последнюю модель передового смартфона!
Примите участие в опросе прямо сейчас — это займет минимум времени.
❓Чем перемещение отличается от копирования в C++?
Узнайте на бесплатном практическом уроке от OTUS, где вы вместе с опытным экспертом разберете:
- синтаксис и подводные камни move-семантики;
- отличие копирования от перемещения;
- когда компилятор может сам, а когда ему нужно подсказать;
- как отличить rvalue от lvalue;
- как избегать лишнего копирования объектов.
👉 Зарегистрируйтесь прямо сейчас: https://otus.pw/mVqm/?erid=LjN8K6SUF
⏰ Занятие пройдёт 21 марта в 20:00 мск и будет приурочено к старту курса «Специализация C++ Developer». Доступна рассрочка на обучение!
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
🖥 О использовании структур размером больше 16 байт
По умолчанию, при передаче в метод/возврате из метода, экземпляры значимых типов копируются, тогда как экземпляры ссылочных типов передаются по ссылке.
В 2008 была выпущена книга «Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries». В ней рекомендовалось не использовать структуры больше 16 байт, поскольку, очевидно, структуры большего размера копируются медленнее. Прошло уже 16 лет, но в сообществе C# разработчиков до сих пор популярно мнение, что производительность структур размером больше 16 байт хуже. Даже Google на запрос «recommended structure size c#» говорит, что это не более 16 байт.
Код бенчмарка очень прост. Он содержит структуры и классы размером от 4 до 160 байт, с шагом 4 байта.
Для каждой структуры и класса есть соответствующий метод, который из параметра типа int cоздаёт соответствующий экземпляр и возвращает его.
И, самое главное, есть непосредственно бенчмарк методы (картинка), каждый из которых создаёт список структур или классов. Размер списка – 1000 элементов.
В общем, после проведения тестов можно убедиться, что использование структур размером больше 16 байт не ухудшает производительность. Сейчас этой границей является размер 64 байта.
А ты знал про это?
@csharp_ci
🔥Подборка лучших обучающих каналов для программистов.
➡️ Делитесь с коллегами и cохраняйте себе, чтобы не потерять
⚡️ Frontend
Javascript академия - крупнейший js канал
React - лучшие гайды и советы по работе с react
Frontend - тутрориалы, уроки, гайды, код
PHP
Книги frontend
Задачи frontend
💥 Хакинг Kali Linux
Kali linux
linux_kal - kali чат
Информационная безопасность
🚀 Data Science
Анализ данных - полезные фишки, код, гайды и советы, маст-хэв датасаентиста
Data Jobs - ds вакансии
Аналитик данных
Data Science книги - актуальные бесплатные книги
Big data
#️⃣C#
С# академия
С# заметки — код, лучшие практики, заметки программиста c#
С# задачи и тесты
С# библиотека - актуальные бесплатные книги
C# вакансии - работа
⚡Машинное обучение
Ml Собеседование - подготовка к собеседовению мл, алгоритмам, кодингу
Ml ru - актуальные статьи, новости, код и обучающие материалы
Ml Jobs - вакансии ML
ML Книги - актуальные бесплатные книги МО
ML чат
Machine Learning - полезные статьи новости гайды и разбор кода
🏆 Golang
Golang - подробные гайды, разбор кода, лучшие практики, заметки
Golang собеседование
Golang вакансии
Golang книги
Golang задачи и тесты
Golang чат
Golang news - новости go
🐍 Python
Python/django
Python Собеседование - подготовка к собеседовению python и разбор алгоритмов
Pro python - статьи, новости, код и обучающие материалы
Python Jobs - вакансии Python
Python чат
Python книги
☕ Java
Java академия
Java вакансии
Java чат
Java вопросы с собеседований
Java книги
🛢Базы данных
Sql базы данных
Библиотека баз данных
SQL чат
💻 C++
C++ академия
С++ книги
C++ задачи - подготовка к собеседовению мл, алгоритмам
C++ вакансии
🐧 Linux
Linux academy
🦀 Rust
Rust программирование
Rust чат
Rust книги для программистов
📲 Мобильная разработка
Android разработка
Мобильный разработчик гайды и уроки
🇬🇧 Английский для программистов
🧠 Искусственный интеллект
ИИ и технологии
Neural - нейросети для работы и жизни
Книги ИИ
Artificial Intelligence
🔥 DevOPs
Devops для программистов
Книги Devops
🌟 Docker/Kubernets
Docker
Kubernets
📓 Книги
Библиотеки Книг для программситов
💼 Папка с вакансиями:
Папка Go разработчика:
Папка Python разработчика:
Папка Data Science
Папка Java разработчика
Папка C#
Папка Frontend
🖥 Полезные фишки, связанные с символом @
Специальный символ @ является "буквальным" идентификатором, короче, показывает, что нечто нужно интерпретировать буквально. У @ масса сфер применения, его можно использовать, чтобы:
▶️указать, что строковый литерал следует интерпретировать буквально. Символ @ в этом случае определяет буквальный строковый литерал. Простые escape-последовательности (например, "\\" для обратной косой черты), шестнадцатеричные escape-последовательности (например, "\x0041" для прописной буквы A) и escape-последовательности Юникода (например, "\u0041" для прописной буквы A) интерпретируются буквально. Только escape-последовательность кавычки ("") не интерпретируется буквально. Кроме того, в случае с интерполированными последовательностями строковых фигурных фигурных скобок ({{ и }}) не интерпретируются буквально; они создают символы с одной фигурной скобкой.
string filename1 = @"c:\documents\files\u0066.txt";
string filename2 = "c:\\documents\\files\\u0066.txt";
Console.WriteLine(filename1);
Console.WriteLine(filename2);
// c:\documents\files\u0066.txt
// c:\documents\files\u0066.txt
string s1 = "He said, \"This is the last \u0063hance\x0021\"";
string s2 = @"He said, ""This is the last \u0063hance\x0021""";
Console.WriteLine(s1);
Console.WriteLine(s2);
// He said, "This is the last chance!"
// He said, "This is the last \u0063hance\x0021"
@ можно использовать в качестве идентификаторов. Символ @ предшествует элементу кода, который компилятор должен интерпретировать как идентификатор, а не ключевое слово C#:string[] @for = { "John", "James", "Joan", "Jamie" };
for (int ctr = 0; ctr < @for.Length; ctr++)
{
Console.WriteLine($"Here is your gift, {@for[ctr]}!");
}
// Here is your gift, John!
// Here is your gift, James!
// Here is your gift, Joan!
// Here is your gift, Jamie!
@ используется, чтобы позволить компилятору различать атрибуты в случае конфликта имен.
🖥 Отличный сборник заданий и упражнений по C#, поможет освежить самые важные понятия
Эти задачи (с решениями) позволят освоить операторы и базовые конструкции языка C#, потренировать такие навыки программирования, как ввод/вывод данных, целочисленную арифметику, логику и все операторы циклов, ну и не только — есть несколько довольно сложных заданий
📁 PDF
@csharp_ci
🫵 Соберите свой первый проект на С++ и добавьте его в портфолио
👉 На бесплатном практическом уроке от OTUS и Карины Дорожкиной — ведущего разработчика в Kaspersky.
На вебинаре:- разберем понятие единицы трансляции;- проследим за ошибками компиляции и линковки, разберёмся в их причинах;- создадим статическую библиотеку и подключим её при помощи CMake;- обсудим разницу между статической библиотекой и динамической.
⏰ Занятие пройдёт 5 марта в 20:00 мск и будет приурочено к старту курса «Специализация C++ Developer». Доступна рассрочка на обучение!
👉 Зарегистрируйтесь прямо сейчас, чтобы занять место: https://otus.pw/JPb4/?erid=LjN8KEppm
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
🖥Что такое NullReferenceException, и как исправить?
Итак кейс: выполняется некоторый код, выбрасывается исключение NullReferenceException со следующим сообщением:
Object reference not set to an instance of an object (В экземпляре объекта не задана ссылка на объект)
null (или Nothing в VB.NET). Это означает, что либо вы присвоили это значение, либо вы ничего не присваивали.null может передаваться от объекта к объекту, от метода к методу. Если нечто равно null в методе "А", вполне может быть, что метод "В" передал это значение в метод "А".NullReferenceException, то это всегда означает: вы пытаетесь воспользоваться ссылкой. И эта ссылка не инициализирована (или уже не инициализирована).null, а вы не сможете вызвать методы через ссылку, равную null, как тут:string foo = null;
foo.ToUpper();
NullReferenceException на 2 строке, потому что вы не можете вызвать метод ToUpper() у ссылки на string, равной null.null, и определите, почему не присвоено верное значение.
🖥 Обработка ошибок с помощью IExceptionHandler в ASP.NET Core 8.0
Относительно недавно на свет появился ASP.NET Core 8.0, и теперь можно обрабатывать ошибки с помощью IExceptionHandler.
А вот и полезная статья о том, как это делать.
⏩Вкратце о IExceptionHandlerIExceptionHandler — это интерфейс, который предоставляет разработчику обратный вызов для обработки известных исключений в центральном расположении.IExceptionHandler реализации регистрируются путем вызова IServiceCollection.AddExceptionHandler. Время существования экземпляра IExceptionHandler — одноэлементное. Можно добавить несколько реализаций, и они вызываются в порядке регистрации.
Если обработчик исключений обрабатывает запрос, он может вернуться true к остановке обработки. Если исключение не обрабатывается обработчиком исключений, то элемент управления возвращается к поведению по умолчанию и параметрам из по промежуточного слоя. Для обработки и необработанных исключений создаются различные метрики и журналы.
📎 Статья
📎 Доки от Windows, как обрабатывать ошибки
@csharp_ci
🖥 Как "схлопнуть" вызовы, чтобы вызываемый код не "захлебнулся"?
▶️Итак, сценарий такой. В коде генерируются некие обновления, которые затем обрабатываются неким методом. Обновления могут генерироваться слишком часто, плюс метод обработки может тормозить, в результате обновления не успевают обрабатываться, накапливаются, обработчик потом делает лишнюю работу.
Хотелось бы как-то "накопить" обновления, пока обработчик занят. Причём, сами данные для обновления уже "накапливаются", об этом заботиться не нужно, нужно только разрулить "накопление" запросов к обработчику, чтобы когда обработчик освободиться обрабатывать не все накопившиеся запросы на обновление по отдельности, а за один раз сразу весь пакет "обновлений" обработать.
Вот так происходит сейчас:
async Task UpdateFoo()
{ ...
await SaveAsync();
}
async Task UpdateBar()
{ ...
await SaveAsync();
}
async Task UpdateBaz()
{ ...
await SaveAsync();
}
async Task SaveAsync()
{ // здесь нужно сделать так,
// чтобы одновременно обрабатывался только 1 запрос
// по окончании которого проверялось бы не было ли ещё запросов
// и если были, то обновление запускалось бы ещё 1 раз (сразу за всё "накопленное")
// и так пока есть обновления по окончании очередной обработки
}
SemaphoreSlim, видимо (с WaitAsync). А вот остальное как лучше сделать?System.Threading.Channels.Channel<T>:private readonly Channel<T> _channel = Channel<T>.CreateUnbounded();
private Task _workerTask;
private async Task WorkerAsync()
{
ChannelReader<T> reader = _channel.Reader;
List<T> list = new();
// ждём здесь, если в канале пусто
while (await reader.WaitToReadAsync())
{
// забираем всё что есть
// ну или можно счётчиком ограничить максимальное количество выгребаемых данных за раз
while (reader.TryRead(out T data))
{
list.Add(data);
}
// пачка собрана, погнали. это можно в try-catch завернуть, чтобы воркер не падал
await UseAsync(list);
list.Clear();
}
}
_workerTask = WorkerAsync();
_channel.Writer.TryWrite(x);
WorkerAsync завершился, нужно вызвать:_channel.Writer.Complete();
await _workerTask;
🖥 Задачка с собеседования от Сбера:
Вставьте код функции Mutate (без использования ключевого слова unsafe), чтобы на консоль вывелось «404». Сигнатуру функции не менять, замыкания не ловить
const string constStr = "000";
Mutate(constStr);
var nonConst = "000";
Console.WriteLine(nonConst);
void Mutate(string str)
{
// write your code here
}
void Mutate(string str)
{
GCHandle handle = GCHandle.Alloc(str, GCHandleType.Pinned);
IntPtr pointer = handle.AddrOfPinnedObject();
Marshal.WriteByte(pointer, 0, (byte)'4');
Marshal.WriteByte(pointer, 4, (byte)'4');
handle.Free();
}
💼 Если ваши сотрудники на удалёнке, так ещё и в разных часовых поясах, то вам явно тяжело выстроить рабочий процесс и сохранить максимум эффективности. Вам может помочь виртуальное пространство от Яндекс 360. На вебинаре 20 марта в 11:00 по Москве они как раз расскажут, как лучше управлять командой в такой ситуации!
Зарегистрироваться можно здесь 👈
Вариант для тех, кто ищет виртуальный сервер с хорошей веб-защитой — Aéza:
– Виртуальные сервера до 6.0 ГГц на лучших процессорах;
– Профессиональная фильтрация атак StormWall;
– Круглосуточная поддержка;
– Anycast фильтрация;
– Низкие цены;
– 15% кешбэка по ссылке.
Бесконечно можно смотреть на три вещи: на огонь, воду и скидку от Aeza!
Говорят: твоё от тебя не уйдет. А зачем ждать? Динозавры тоже ждали и остались в прошлом
Используй 50% скидку и погнали в будущее!
Кроме того, сейчас Aéza раздает личные бесплатные сервера, забираем тут. Регистрация, подписка, платежи не потребуются.
Реклама. Индивидуальный предприниматель Лобанов Леонид Константинович. ИНН 781625705648 erid: LjN8KEr3S
🖥 Создание бесконечно повторяющегося метода в C#
Итак задача:
как создать бесконечно повторяющийся метод в C#, который работает на протяжении работы приложения?
Предположим, метод должен через определенное количество времени выводить какую-то информацию на экран; он должен работать вне зависимости от действий пользователя.
⏩Если в двух словах, то для этого можно использовать асинхронность.
Итак, создаём:
private async Task RunLoopAsync(CancellationToken token)
{
try
{
while (true)
{
// ... что-то сделать
await Task.Delay(1000, token); // подождать одну секунду
}
}
catch (OperationCanceledException)
{ } // сработала отмена, ничего не делать
}
private CancellationTokenSource _cts;
private async void StartLoop()
{
if (_cts != null)
return;
try
{
using (_cts = new CancellationTokenSource())
{
await RunLoopAsync(_cts.Token);
}
}
catch (Exception ex)
{
// ... ex.Message
}
_cts = null;
}
private void StopLoop()
{
_cts?.Cancel();
}
🖥 Итак, реальный кейс: нужно записать значение каждой строки InputField в List<string>
Эти 2 варианта ниже неправильные, они не работают:
— List = (InputField.text).ToList
— List = InputField.text
Так как InputField.text это тип string , я не могу преобразовать его в List<string>. Что в итоге делать?
⏩Всё довольно просто, можно записать строки InputField в List<string> вот так:
string text = InputField.text;
string[] lines = text.Split(Environment.NewLine);
string[] lines = text.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
List<string> list = lines.ToList();
🖥 Найди ошибку в этом коде C# и реши задание правильно
Чисто академическое задание но почему бы и нет 🙃
Вот неправильное решение, подумай, какие в нём ошибки и напиши по красоте.
⏩Готово? Получилось? Можешь смотреть решение
@csharp_ci
🖥 Немного о новых фичах C# 12
▶️В C# 12 упрощен способ создания массивов и коллекций с помощью выражения коллекций (collection expression), которые представляют унифицированный подход к созданию коллекций. Так, если раньше создание массивов выглядело так:
int[] nums1 = { 1, 2, 3, 4 };
int[] nums2 = new int[] { }; // пустой массивint[] nums1 = [ 1, 2, 3, 4 ];
int[] nums2 = []; // пустой массив
List<int> list1 = [1, 2, 3, 4];
List<int> list2 = []; // пустой список
Span<int> span1 = [1, 2, 3, 4];
Primary constructors) позволяют добавлять параметры к определению класса/структуры и использовать эти параметры внутри класса/структуры:var tom = new Person("Tom", 38);
Console.WriteLine(tom);
public class Person(string name, int age)
{
public Person(string name) : this(name, 18) { }
public string Name => name;
public int Age => age;
public override string ToString() => $"name: {name}, age: {age}";
}Person определен первичный конструктор с двумя параметрами - name и age. Эти параметры применяются для инициализации свойств Name и Age и используются в методе ToString().public Person(string name) : this(name, 18) { }
💎Свежайший 8-часовой ролик-курс по C# от freeCodeCamp.org
Здесь разбираются самые важные понятия, очень много практики — на протяжении ролика постоянно реализуются мини-проекты
А вот темы, которые затрагиваются в ролике:
Обзор языка С#
🔘Структура программы на С#
🔘Основные операции ввода/вывода
🔘Рекомендации по оформлению кода
Использование структурных переменных
🔘Общая система типов (Common Type System)
🔘Использование встроенных типов данных
🔘Пользовательские типы данных
🔘Преобразование типов
Операторы и исключения
🔘Операторы в С#
🔘Обработка исключений
Методы и параметры
🔘Использование методов
🔘Использование параметров
🔘Перегрузка методов
Массивы и коллекции
🔘Массивы
🔘Списки – List<T>
🔘Двухсвязные списки – LinkedList<T>
🔘Словари – Dictionary<TKey, TValue>
Основы ООП
🔘Классы и объекты
🔘Инкапсуляция данных
🔘Наследование и полиморфизм
Использование ссылочных данных
🔘Reflection (рефлексия)
🔘Пространства имен
🔘Приведение типов данных
Создание и удаление объектов
🔘Использование конструкторов
🔘Уничтожение объектов
Наследование в C#
🔘Использование интерфейсов
🔘Использование абстрактных классов
Агрегации, пространства имён, сборки и модули
🔘Использование внутренних (internal) классов, методов и данных
🔘Использование агрегаций
🔘Фабрики классов
🔘Пространства имен
🔘Модули и сборки
Операции, делегаты, события
🔘Операции
🔘Создание и использование делегатов
🔘События
Свойства и индексаторы
🔘Свойства
🔘Индексаторы
Посмотрите хотя бы по диагонали — прокачаете свой C#
💎 Learn C# – Full Course with Mini-Projects
@csharp_ci
Вам когда-нибудь требовалось реализовать полнофункциональный текстовый редактор в вашем приложении C#?
Просто прочтите эту интересную статью по ссылке, где автор представляет текстовый редактор, основанный на классе RichtextBox.
Исходники находятся на сервере Codeproject, мне понадобилось аж три попытки, чтобы их скачать 😲
Надеюсь, скоро автор перенесет этот полезный проект на GitHub, а пока вот ссылка
🔗Статья и проект
@csharp_ci
⚡Онлайн-Хакатон "Городские Легенды" от Группы компаний Росохрана и ООО «Эпсилон»!
💡Кейсы хакатона:
1. Разработка интерактивного голосового помощника с использованием анимированного аватара.
2. Интеграция интерактивного аватара в городскую экосистему цифровых сервисов.
👨💻Для кого хакатон?
- C++/C#-разработчиков;
- Unity-разработчиков;
- 3D-Моделлеров;
- UX/UI-дизайнеров;
- AI-Специалистов;
- Команды из 5 человек;
- Готовых внедрить любимых персонажей в городскую среду и побороться за главный приз!
🏆Общий призовой фонд - 700 000 рублей!
📅Дата проведения: 11-18 Марта
📍Формат: Онлайн
Подробная информация и регистрация: https://tglink.io/6c8079854982?erid=LjN8KVcPo
🖥 Новый выпусе- Microsoft .Data.SqlClient 5.2 - с .NET 8, поддержкой пакетной обработки Sql и идентификации рабочей нагрузки + многое другое - смотрите примечания к выпуску:
📌 Релиз
#dotnet #sqlserver
@csharp_ci