Рубрика «C#» - 64

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

— Что ты думаешь об интерфейсах?

Имеешь в виду интерфейсы в Java или C#?

— Да. Классная фича этих языков?

Просто великолепная!

— Правда? А что такое интерфейс? Это то же самое что и класс?

Ну… Не совсем!

Читать полностью »

Введение

Был у меня случай, когда мне понадобилась string, которая содержала данные из ресурсов XAML в WPF, так как мне не разрешалось указывать ресурсы в string. Я сразу подумал, что, возможно, можно использовать MarkupExtension для этого, но точно не знал, как это сделать. Я провёл некоторые исследования, и я оказался не единственным, кто был заинтересован в этом вопросе. Я обнаружил, что Мартин Греч опубликовал несколько ответов, которые позволили создать строку со строковой частью, объединенной с привязкой. Его MarkupExtension имеет свойство string и свойство Binding, и это было очень просто. Я включил его код в образец для справки.

Я сразу начал работать с этим, с чем-то совершенно другим, так как мне нужно было получить ресурсы XAML, и я хотел иметь возможность иметь несколько ресурсов XAML в string. Я рассматривал наличие нескольких свойств, но решил вместо этого взять лист из того, что недавно было добавлено в C#, интерполяцию строк и использование того же формата с именами ресурсов в фигурных скобках. Я бы мог пройти и вручную извлечь имена ресурсов из строки, но понял, что RegEx лучше решит эту проблему.
Читать полностью »

На просторах интернета можно найти множество описаний и примеров по созданию telegram bot-ов.Но Telegram Bot Api имеет ограниченный функционал. Для решения задачи по выгрузке сообщений из Telegram по ключевому слову необходимо использовать Telegram API. За основу была взята библиотека TLSharp. Стоит сразу прояснить, что дальнейшая работа возможна только для зарегистрированных пользователей в Telegram.

Стартом работы с API служит регистрация приложения:

  1. Заходим на сайт Телеграмма и вводим свой номер телефона. Вводим код подтверждения.

    image

  2. Попадаем на страницу разработчика. Для завершения регистрации необходимо заполнить поля, характеризующие ваше будущее приложение.

    image

  3. Получаем api_id и api_hash.

Читать полностью »

Полнотекстовый поиск даёт возможность искать документы по текстовому содержимому. Такая необходимость может возникнуть, когда система содержит много текстовых сущностей, а пользователям требуется учитывать эти данные во время поиска. Мы столкнулись с подобной ситуацией при разработке решения для документооборота*. Данные системы хранятся в MS SQL Server или PostgreSQL, а гибкий атрибутивный поиск позволяет находить документы по различной мета-информации. Однако со временем этого стало недостаточно. Перед нами встала задача: научиться искать документы по текстовым свойствам и приложенным файлам.

Фантастик-Elasticsearch. Как мы «укротили» умный поиск по документам - 1

Читать полностью »

C# 7 добавляет ряд новых возможностей и фокусирует внимание на потреблении данных, упрощении кода и производительности. Самые большие фичи были уже рассмотрены — кортежи, локальные функции, сопоставление с образцом и throw выражения. Но есть и другие новые возможности, как большие, так и малые. Все они сочетаются, чтобы сделать код более эффективным и понятным, чтобы все были счастливы и продуктивны.

Давайте рассмотрим и остальные возможности новой версии C#. Итак! Начнем!Читать полностью »

0. Лирика

Поговорим про unit тестирование. Для больших и возрастных проектов весьма актуальна проблема «толстых» сервисов. Я сейчас говорю про большое количество зависимостей передаваемых в конструктор. Если к этому добавить несколько десятков методов, которые необходимо тестировать, становится очевидно, что тратится много времени на мокирования ненужных частей. Решить проблему поможет автоматизация,. т.е. создание экземпляра необходимого типа и мокирование неиспользованных зависимостей в процессе выполнения.

Получается нам нужно

var myService = new MyService(A.Fake<ISevice1>(), new Sevice2(), 
               A.Fake<ISevice3>(), A.Fake<ISevice4>(), 
               A.Fake<ISevice5>(), A.Fake<ISevice6>())

заменить на нечто похожее. Напоминает паттерн builde, не так ли?

 var myService = GetInstance<MyService>().With(new Sevice2()).Subject;

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

Разумеется нам не обойтись без рефлексии.
Читать полностью »

Картинка для привлечения внимания: > Replay bug-10492; going back in time

Привет! Я пишу статьи, посвященные архитектуре в игровой разработке. В этой статье я хочу разобрать паттерн Команда (Command). Он многогранен, и может быть применен по-разному. Но я покажу, как сделать мой любимый трюк — машина времени для отладки изменений гейм стейта.

Эта штука сэкономила мне кучу времени в поиске и воспроизведении сложных багов. Она позволяет делать "снапшоты" игрового состояния, историю его изменения, и пошагово их применять.

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

Хотите узнать как это сделать? Прошу под кат.

Читать полностью »

Нельзя просто так взять и отредактировать субтитры - 1

Сколько людей пользуются субтитрами по всему миру? Вероятно, очень много. В образовательных целях или просто из-за любви к оригинальной озвучке, в интернете можно найти субтитры практически к любому фильму и на многих языках. Создаётся всё это в специальных программах. Как и в большинстве программ, в Subtitle Edit не обошлось без сюрпризов в виде багов.
Читать полностью »

Введение

Наверное в каждого большом проекте есть папки с названиями tools, utils, helpers и другими, которые хранят в себе какие-то простые абстракции и статические функции. Часто код из этих папок мигрирует из проекта в проект. Причем в проектах, авторы которых друг-друга в глаза не видели, вспомогательный код может быть почти идентичным. Предлагаю пользователям хабра поделиться друг с другом своими вспомогательными функциями.

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

Потокобезопасный Random

В C# класс Random не является потокобезопасным, но чтобы при генерации случайного числа из разных потоков в небольшом отрезке времени не получить одинаковое значение, переменную типа Random необходимо хранить статически. Решение этой проблемы может быть класс ThreadSafeRandom:

Читать полностью »

"ААА! Пришло время переписывать на .NET Coreǃ", говорили они, WPF в комментариях обсуждали. Так давайте же проверим, можно ли написать кросс-платформенное GUI приложение на .NET / C#.

Кроссплатформенная новогодняя демка на .NET Core и Avalonia - 1

Новогоднее настроение навеяло идею сделать анимацию падающего снега. Были такие демки под DOS, горящий огонь, фракталы, снежок, падающий на ёлочку, и так далее.

Как увидим ниже, это не только весело, но и позволит испытать ключевой функционал UI фреймворка. Поехали!

Читать полностью »


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js