Как стать автором
Обновить
112

C# *

Объектно-ориентированный язык программирования

Сначала показывать
Порог рейтинга
Уровень сложности

Как в C# быстро извлечь подстроку

Уровень сложности Простой
Время на прочтение 4 мин
Количество просмотров 1.1K

Извлечение подстроки. Казалось бы, что тут может быть сложного? В любом современном языке программирования это можно сделать через функцию substring или через slicing. За время работы C# разработчиком я повидал разный код, в том числе разные способы извлечения подстроки. В этой статье мы рассмотрим самые распространённые из них, сделаем замеры производительности и проанализируем результаты.

Читать далее
Всего голосов 3: ↑3 и ↓0 +3
Комментарии 5

Новости

Календарь семьи на MudBlazor с авторизацией и развертыванием на Ubuntu

Уровень сложности Простой
Время на прочтение 4 мин
Количество просмотров 1.4K

Введение:

MudBlazor - это амбициозная библиотека компонентов для Blazor, основанная на дизайне Material и с акцентом на простоту использования и четкую структуру. Она идеально подходит для разработчиков .NET, которые хотят быстро создавать веб-приложения, не сталкиваясь с проблемами CSS и JavaScript. MudBlazor полностью написан на C#, что позволяет вам легко адаптировать, исправлять или расширять фреймворк. https://mudblazor.com/

Задачей была разработать полезное приложение для нашей семьи, названное "Семейный календарь", которое объединяет функциональность от Google, Yandex и Mail для удобного ведения семейного расписания. Я хотел создать приложение, которое позволит нам легко планировать и отслеживать события, задачи и важные даты в нашей семье.

Читать далее
Всего голосов 5: ↑3 и ↓2 +1
Комментарии 9

Блеск и нищета паттерна «Спецификация» в С#. Оцениваем планы запросов

Уровень сложности Сложный
Время на прочтение 20 мин
Количество просмотров 6.1K

О паттерне «Спецификация», который позволяет улучшить структуру приложения, и, следовательно, увеличить гибкость, уменьшив при этом объем кода, а значит — сократить количество ошибок, но это не точно. Почему? - читаем ниже. 

Читать далее
Всего голосов 29: ↑28 и ↓1 +27
Комментарии 40

Async/await, There is no thread – легко обмануть тех, кто сам обманываться рад

Уровень сложности Средний
Время на прочтение 3 мин
Количество просмотров 11K

Когда нам показывают на некотором примере, что асинхронная операция не создает потока, нам пытаются внушить, что асинхронная операция НИКОГДА не создает потока и в принципе не может его создать, но это не правда! Простой пример с работающим кодом доказывает обратное. Давайте разберем этот пример.

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

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

Читать далее
Всего голосов 14: ↑9 и ↓5 +4
Комментарии 38

Истории

Как быстро и качественно импортозаместить UI

Уровень сложности Средний
Время на прочтение 8 мин
Количество просмотров 3.6K

Всем привет.

Хочу рассказать о своем опыте импортозамещения UI.

Не предлагаю ничего нового, известный подход, приложенный к конкретной задаче.

Кратко задачу можно описать так:

Есть: Исходный проект с множеством таблиц и форм.

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

Решение:

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

2.       Дополнить этот файл в той части которую не получилось собрать автоматически.

3.       Создавать нужные файлы по шаблону заменяя подстановочные символы в шаблоне значениями из файла. Полученные файлы могут быть если необходимо доработаны.

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

Очевидные для меня плюсы такого подхода:

1) На порядок быстрее.

2) Код максимально однообразен.

3) Код можно легко покрыть автоматически созданными тестами.

4) В случае внесения в шаблон изменений, а это обязательно случится и не раз, можно быстро пересоздать код.(если шаблон доработан, то используя систему контроля версий можно быстро поправить как надо)

 

Читать далее
Всего голосов 12: ↑0 и ↓12 -12
Комментарии 24

Обзор библиотеки FluentValidation. Часть 7.1. Встроенные валидаторы

Уровень сложности Средний
Время на прочтение 9 мин
Количество просмотров 806

Рассматриваем часть встроенных валидаторов:

NotNull (значение не равно null)
Null (значение равно null)
NotEmpty (значение не равно null, пустой строке, пробелам, 0 элементам коллекции)
Empty (значение равно null, пустой строке, пробелам, 0 элементам коллекции)
NotEqual (значение не равно определённому либо не равно указанному свойству)
Equal (значение равно определённому либо равно указанному свойству)

Читать далее
Всего голосов 9: ↑4 и ↓5 -1
Комментарии 14

Rule-based AI + Unity

Уровень сложности Простой
Время на прочтение 8 мин
Количество просмотров 1.4K

Привет! В прошлой статье мы уже говорили про искусственный интеллект и трудности его выбора. В этой мы поговорим как начать его писать так чтобы потом не выстрелить себе в жопу ногу.

Читать далее
Всего голосов 4: ↑3 и ↓1 +2
Комментарии 6

Самый простой и подробный гайд по конкурентным коллекциям в C#

Уровень сложности Простой
Время на прочтение 18 мин
Количество просмотров 10K


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

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

В рамках статьи я попробую объяснить System.Collections.Concurrent настолько, насколько это возможно, включая примеры и сценарии использования. Также будет затронута тема сравнения с неизменяемыми (immutable) и замороженными (frozen) коллекциями.
Читать дальше →
Всего голосов 60: ↑58 и ↓2 +56
Комментарии 23

Другой способ понять, как работает async/await в C#

Уровень сложности Средний
Время на прочтение 7 мин
Количество просмотров 6.7K

Про закулисье async/await написано предостаточно. Как правило, авторы декомпилируют IL-код, смотрят на IAsyncStateMachine и объясняют, вот дескать какое преобразование случилось с нашим исходным кодом. Из бесконечно-длинной прошлогодней статьи Стивена Тауба можно узнать мельчайшие детали реализации. Короче, всё давно рассказано. Зачем ещё одна статья?

Я приглашаю читателя пройти со мной обратным путём. Вместо изучения декомпилированного кода мы поставим себя на место дизайнеров языка C# и шаг за шагом превратим async/await в код, который почти идентичен тому, что синтезирует Roslyn.

Читать далее
Всего голосов 16: ↑16 и ↓0 +16
Комментарии 26

Обзор библиотеки FluentValidation. Часть 6. Внедрение зависимостей

Уровень сложности Средний
Время на прочтение 5 мин
Количество просмотров 1K

Библиотеку FluentValidation можно использовать с любой библиотекой внедрения зависимостей. В этой части будут примеры на библиотеке Microsoft.Extensions.DependencyInjection. У нас есть следующие валидаторы:

Читать далее
Всего голосов 8: ↑4 и ↓4 0
Комментарии 0

KatWalk C2: ч2, подслушаем, подсмотрим и разнюхаем или как общаться с незнакомым железом на незнакомом языке

Уровень сложности Средний
Время на прочтение 27 мин
Количество просмотров 603

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

Однако, получение данных требует постоянно висящего приложения (на C#), и надо понять что же конкретно оно делает.

Давайте разберёмся как общаться с железом и избавимся от балласта!.. Переписав на Kotlin. Почему Kotlin? Потому что я на нем никогда еще не писал.

Погружаемся
Всего голосов 1: ↑1 и ↓0 +1
Комментарии 4

Обзор библиотеки FluentValidation. Часть 5. Условия

Уровень сложности Средний
Время на прочтение 4 мин
Количество просмотров 862

Вы можете задавать условия через методы расширения When и Unless для определения, должны ли выполняться все предыдущие валидаторы (до вызова метода расширения) либо конкретный валидатор в правиле RuleFor. Применение метода расширения When:

Читать далее
Всего голосов 5: ↑3 и ↓2 +1
Комментарии 2

Семантические ловушки асинхронности: Ключи к разгадке и эффективному освоению тем Task, Синхронность, Асинхронность

Уровень сложности Средний
Время на прочтение 11 мин
Количество просмотров 7.2K

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

Такая ситуация имеет место когда начинающий программист знакомится с темами Task, Синхронность, Асинхронность. Ситуация усугубляется тем что зачастую, более опытные коллеги применяют в жаргоне выражения из разряда «Синхронное/Асинхронное выполнение задачи».

Для того, чтобы распутать этот «Гордиев узел», давайте подойдем к проблеме издалека: рассмотрим ее на примере работы симфонического оркестра. Сравним при этом значения проблемных терминов с точки зрения людей, обладающих различной профессиональной ориентацией.

Читать далее
Всего голосов 15: ↑12 и ↓3 +9
Комментарии 15

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн

Обзор библиотеки FluentValidation. Часть 4. Сообщения об ошибках. Локализация

Уровень сложности Средний
Время на прочтение 9 мин
Количество просмотров 1.1K

Прямо "из коробки" доступны переводы сообщений об ошибках на разных языках для встроенных валидаторов. Есть возможность частично переопределять сообщения об ошибках для встроенных валидаторов под нужную локаль. Также возможно локализовать свои кастомные сообщения об ошибках (например через файлы ресурсов).

Исследуем:
1. Свойство ValidatorOptions.Global.LanguageManager.Culture
2. Свойство CultureInfo.CurrentUICulture
3. Свойство CultureInfo.CurrentCulture
4. Тип LanguageManager
5. Тип IStringLocalizer

Читать далее
Всего голосов 7: ↑3 и ↓4 -1
Комментарии 2

Обзор библиотеки FluentValidation. Часть 3. Сообщения об ошибках

Уровень сложности Средний
Время на прочтение 5 мин
Количество просмотров 1.1K

В этом обзоре про:

1. Переопределение сообщения об ошибке WithMessage

2. Заполнители для сообщения об ошибке {PropertyName}, {PropertyValue}, {PropertyPath}

3. Переопределение названия свойства в сообщении об ошибке WithName, OverridePropertyName

Читать далее
Всего голосов 12: ↑6 и ↓6 0
Комментарии 2

Обзор библиотеки FluentValidation. Часть 2. Коллекции

Уровень сложности Средний
Время на прочтение 3 мин
Количество просмотров 1.8K

Способы описания правил валидаций для элементов коллекций.

Метод RuleForEach
Комбинация методов RuleForEach + ChildRules
Комбинация методов RuleFor + ForEach

Читать далее
Всего голосов 14: ↑8 и ↓6 +2
Комментарии 4

Обзор библиотеки FluentValidation. Часть 1. Первые шаги

Уровень сложности Средний
Время на прочтение 5 мин
Количество просмотров 2.7K

Всем привет, меня зовут Влад, я начинаю серию статей по обзору библиотеки FluentValidation на русском языке. Источником информации является официальная дока. Не могу назвать это уроком или полноценным переводом, решил назвать это обзорами.

Читать далее
Всего голосов 16: ↑10 и ↓6 +4
Комментарии 16

Работа со временем и датой в C# с применением библиотеки Humanizer

Время на прочтение 7 мин
Количество просмотров 4.1K

Цель этой статьи — показать вам, как использовать Humanizer, чтобы вывести работу со временем и датой в ваших C#-проектах на новый уровень. Я расскажу о том, как преобразовать объекты DateTime и TimeSpan в удобный для восприятия человеком вид, как настраивать параметры гуманизации и как объединять гуманизацию строк со временеме/датой. Мы также рассмотрим некоторые реальные сценарии использования и примеры того, как Humanizer может улучшить пользовательский опыт в отношении времени и даты.

Читать далее
Всего голосов 16: ↑12 и ↓4 +8
Комментарии 12

Десктопное приложение с нуля на .Net и C# с помощью ChatGPT

Уровень сложности Простой
Время на прочтение 13 мин
Количество просмотров 18K

Говорят, что нейросети скоро заменять программистов, можно будет просто ставить им задачу и они будут сами писать код. В своей работе я довольно часто использую ChatGPT и по опыту знаю, что его ответы далеко не всегда адекватные, особенно если задача нетривиальная. Но поскольку я задаю ему вопросы, касающиеся моей профессиональной области (я фронтендер), то ещё на этапе чтения его ответа я могу понять, где он прогнал и уточнить какие-то моменты. Порой даже я могу просто уловить его идею и дальше не мучать расспросами, а докрутить его решение сам.

Мне стало интересно, каково всё-таки писать приложение с помощью нейросети с нуля (и возможно ли это вообще, при условии, что ты не программист), поэтому для чистоты эксперимента я выбрал область, в которой я совершенно не шарю - попробую написать десктопное приложение на .Net и C#.

Читать далее
Всего голосов 39: ↑37 и ↓2 +35
Комментарии 27

Правило 16 байт: развенчиваем миф о производительности структур в C#

Уровень сложности Средний
Время на прочтение 4 мин
Количество просмотров 13K

По умолчанию, при передаче в метод или при возврате из метода, экземпляры значимых типов копируются, когда как экземпляры ссылочных типов передаются по ссылке. В 2008 году была выпущена книга «Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries»‎. В этой книге рекомендовалось не использовать структуры размером больше 16 байт, поскольку, очевидно, структуры большего размера копируются медленнее. Несмотря на то, что прошло уже 16 лет, в сообществе C# разработчиков до сих пор популярно мнение, что производительность структур размером больше 16 байт хуже. Даже Google на запрос «recommended structure size c#» говорит, что это не более 16 байт. В этой статье мы попробуем докопаться до правды.

Читать далее
Всего голосов 54: ↑53 и ↓1 +52
Комментарии 31

Вклад авторов

Работа