Все потоки
Поиск
Написать публикацию
Обновить
270.56

C# *

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

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

Непобедимый null: копаемся в исходном коде nopCommerce

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

nopCommerce — бесплатная платформа для создания интернет-магазинов с открытым исходным кодом, разработанная на базе ASP.NET Core. Сегодня мы узнаем, какие неоднозначные моменты таятся в коде платформы.

Читать далее

Малоизвестные детали реализации Math.Round() в .Net

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

Недавно довелось разбирать багрепорт одного клиента на нашу программу, где клиент указал на ошибку в отчете в одну копейку.Казалось бы, сложно себе представить программиста или вообще IT-шника, который не знает как работает функция округления. Тем не менее, почти двадцатилетний опыт разработки в данном случае не панацея. Разобравшись с корнями проблемы, я поискал материалы в русскоязычном и англоязычном интернете, и если на английском ещё есть тематические подборки материалов, но на русском и тем более на Хабре я этого не нашёл.Поэтому спешу поделиться с читателями Хабра собранным и систематизированным материалом.

Читать далее

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

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

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

Читать далее

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

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

Введение:

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

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

Читать далее

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

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

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

Читать далее

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

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

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

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

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

Читать далее

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

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

Всем привет.

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

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

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

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

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

Решение:

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

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

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

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

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

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

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

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

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

 

Читать далее

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

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

В этой части рассмотрим следующие валидаторы:

NotNull — значение не равно null

Null — значение равно null

NotEmpty — значение не равно null, пустой строке, пробелам, 0 элементам коллекции

Empty — значение равно null, пустой строке, пробелам, 0 элементам коллекции

NotEqual — значение не равно определённому либо не равно указанному свойству

Equal — значение равно определённому либо равно указанному свойству

Пройти валидацию

Rule-based AI + Unity

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

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

Читать далее

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

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


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

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

В рамках статьи я попробую объяснить System.Collections.Concurrent настолько, насколько это возможно, включая примеры и сценарии использования. Также будет затронута тема сравнения с неизменяемыми (immutable) и замороженными (frozen) коллекциями.
Читать дальше →

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

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

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

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

Читать далее

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

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

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

Пройти валидацию

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

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

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

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

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

Погружаемся

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

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

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

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

Пройти валидацию

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

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

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

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

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

Читать далее

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

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

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

Исследуем:

Свойство ValidatorOptions.Global.LanguageManager.Culture

Свойство CultureInfo.CurrentUICulture

Свойство CultureInfo.CurrentCulture

Тип LanguageManager

Тип IStringLocalizer

Пройти валидацию

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

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

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

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

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

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

Пройти валидацию

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

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

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

Метод RuleForEach

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

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

Пройти валидацию

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

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

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

Пройти валидацию

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

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

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

Читать далее

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