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

.NET *

Хаб со знаниями про .NET

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

.NET Upgrade Assistant теперь может оценить ваш код и указать на ошибки/недочёты

При обновлении версии можно использовать новую функцию .NET Upgrade Assistant - проверить и получить от инструмента оценку написанного исходного кода. После сканирования вам будет предоставлен отчёт с проблемными местами, да ещё и классифицированный по серьёзности. Также пользователь сможет переходить к решению конкретной проблемы и отмечать ее исправленной. Microsoft  отмечает, что вместе с определением проблемы будет предоставлен список ссылок и рекомендаций по исправлению ошибок.

Инструмент доступен как расширение Visual Studio  или как  инструмент командной строки https://www.nuget.org/packages/upgrade-assistant

Интересно, насколько популярен будет этот инструмент. И конечно, как сильно он сократит время тестирования команде.

Теги:
+3
Комментарии0

Реализация перераспределения целей (retarget) в играх RTS жанра

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

Задача выбора целей для атакующих NPC

В играх RTS жанра обязательно возникает задача, как выбрать для NPC цель. Мы хорошо знаем, когда игроки на их жаргоне говорят "заагрился", что означает, что некий юнит, обратил внимание на юнитов игрока, и будет их преследовать и атаковать. В ряде игр от заагрившегося юнита можно убежать, в других наоборот, он будет вас выслеживать "по запаху, остаткам крови", как это реализовано в JA3. Но как усложнится задача, когда агрессивных NPC в игре сотни, и у игрока аналогично их сотни, или тысячи. Можно ли раз и навсегда заагрится на какого то конкретного юнита? По какому принципу перераспределять цели между разными NPC? Все это не тривиальные задачи, но они имеют одно достаточно простое решение на базе алгоритма искусственного интеллекта, который своими корнями восходит к алгоритму градиентного спуска.

Теги:
Всего голосов 1: ↑1 и ↓0+3
Комментарии0

Ссылки для изучения асинхронности в C#.

  1. Во-первых, стоит прочитать весь блок статей на MSDN.

  2. Первый гигант async/await - Stephen Cleary. Вводная статья.

  3. Статья об устройстве async/await под капотом. Не обязательно заучивать всю машину состояний под await, но тут как с блоком итератора yield - код пишется, а руки трясутся.

  4. На этом этапе может начаться каша в голове и встреча с SynchronizationContext. Начать можно с этой статьи на MSDN. Но если она покажется душной, переходите к пункту 5.

  5. Второй гигант, и тоже Stephen. Я советую перечитать все статьи обоих, что можно найти. Но продолжая тему контекста синхронизации - эта статья крайне важна для тех, кто тренируется в консольных приложениях. Вопрос об асинхронности/многопоточности уходит после нее. И небольшой, но классный ответ на SO о TaskScheduler.

  6. Но если он все же не ушел - There is no thread. Также советую загуглить словосочетание из этой статьи - naturally-asynchronous operations.

  7. Для закрепления пунктов 4,5,6 можно почитать о Task.Run() и комплексных случаях использования многопоточности и асинхронности. Внутри этого блока статей много полезных ссылок и на другие материалы.

  8. Лучшие практики от Cleary. Кстати, у него есть книга по асинхронности, но лично не читал, отзывы не понравились.

  9. Обработка исключений.

Теги:
Всего голосов 8: ↑7 и ↓1+6
Комментарии1

Маленькая победа над отступами в IDE Visual Studio


Рабочая IDE Visual Studio 2022, на Windows
Недавно дали проект, в котором почему‑то все отступы через tab‑ы. Я привык к «точкам»(spaces). Мне хотелось как‑то быстро конвертнуть проект из табов — в «точки».
Быстрое гугление дало, что нужно просто поправить в TextEditor настройку с отступами. Далее, еще советовали Adaptive Formatting.
Все советы не помогли, кроме одного, чтобы конвертнуть — нужно сделать вручную замену везде с табов на точки. Я так и сделал.
Далее, я попробовал нарушить отступ в одном файле и сделать формат этого файла. И в нем форматирование вернулось — как и было ранее — с табами.
Что же не так?
Еще немного гугления натолкнуло на мысль, что у меня в проекте есть .editorconfig
И вот только там я обнаружил причину моих «страданий»
Я поменял в этом конфиге с indent_style = tab на indent_style = space
И все заработало как и ожидалось!

Теги:
Всего голосов 4: ↑0 и ↓4-4
Комментарии4

А все уже переводят свои классы в силед ради производительности?

Все ссылки говорят, что рили крута фича...
https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-6/#peanut-butter
https://www.youtube.com/watch?v=d76WWAD99Yo
https://stackoverflow.com/questions/2134/do-sealed-classes-really-offer-performance-benefits
https://www.meziantou.net/performance-benefits-of-sealed-class.htm

Я один не знал этого?!!
Кстати, наткнулся на эту тему в ответе на ревью-замечание в мердж-реквесте.

Теги:
Всего голосов 4: ↑3 и ↓1+2
Комментарии0

Интересный вопрос. Что выведет данная программа? А скомпилируется ли она вообще?

var str = new TheBestStructEver(5);

Console.WriteLine(str.A);

public struct TheBestStructEver
{
    public int A;

    public TheBestStructEver(int a)
    {
        A = a;
        this = new TheBestStructEver();
    }
}

Ответ: Да, скомпилируется, причем без всяких предупреждений, и выведет 0.

Давайте разберем почему это так. Обратимся к IL-коду нашей структуры, а конкретнее к 12-ой строчке. Вот как она выглядит в IL-коде:

IL_0013: ldarg.0
IL_0014: initobj      TheBestStructEver

Итак, первая строчка загружает в стек нулевой аргумент, переданный в метод (конструктор - тоже метод). Аргумент под нулевым индексом - это указатель на объект, в котором мы работаем, то есть this. initobj инициализирует каждое поле структуры нулями или null по адресу, которое лежит у нас первым в стеке (а у нас там лежит указатель на this). Дополнительно мы еще передаем токен, который указывает тип структуры. Таким образом получается, что у нас вся структура "перезатерлась нулями" и значение поля A равно нулю.

Теги:
Всего голосов 2: ↑2 и ↓0+2
Комментарии4

Microsoft представила выпуск открытой платформы .NET 8, созданной благодаря унификации продуктов.NET Framework,.NET Core и Mono. На основе.NET 8 можно создавать многоплатформенные приложения для браузера, облачных систем, рабочего стола, IoT‑устройств и мобильных платформ, используя единые библиотеки и общий процесс сборки, не зависящий от типа приложения.

Сборки.NET SDK 8,.NET Runtime 8 и ASP.NET Core Runtime 8 сформированы для Linux, macOS и Windows. .NET Desktop Runtime 8 поставляется только для Windows. Ветка .NET 8 отнесена к категории LTS и будет сопровождаться до ноября 2026 года. Связанные с проектом наработки распространяются под лицензией MIT.

В состав .NET 8 входит Runtime с JIT-компилятором RyuJIT, спецификации API, библиотеки WPF, Windows Forms, WinUI, Entity Framework, интерфейс командной строки dotnet, а также инструменты для разработки микросервисов, библиотек, серверных, графических и консольных приложений. Отдельно опубликованы стек для разработки web-приложений ASP.NET Core 8.0, ORM-прослойка Entity Framework Core 8.0 (драйверы имеются, в том числе, для SQLite и PostgreSQL), библиотека WPF 8 (Windows Presentation Foundation), фреймворк Windows Forms 8 для разработки GUI, платформа Aspire 8 для создания приложений Cloud Native, фреймворк MAUI 8 для разработки многоплатформенных интерфейсов пользователя, а также выпуски языков C# 12 и F# 8. Поддержка .NET 8.0 и C# 12 включена в свободный редактор кода Visual Studio Code.

Источник: OpenNET.

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

Расскажите своё мнение: на чём актуально писать более-менее крупную софтину под windows?

Работаю в проекте, нужна программа контроля доступа сотрудникам. БД + GUI + работа с устройством (перезаписывалка RFID меток). Проект - студенчесский стартап, так что пишем сами, не используем интеграции с крупными решениями.

Встал вопрос на чём писать. У меня компетенций в равной степени хватает на QT + C++, .NET + C# или Electron + js. Поэтому сложно определиться, важна скорость разработки и количество гайдов. По скорости выигрывает electron, а по гайдам .net.

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

Если Вы шарите в современной разработке программ под виндовс, дайте, пожалуйста, своё мнение, с удовольствием пообщаюсь в комментах.

Заранее спасибо!

P.S. Надеюсь не вызвал постом ощущение что я не желаю думать свой бОшкой, просто есть внутренний крик души, подумал, почему бы не посоветоваться с умными хабрятами)

Теги:
Всего голосов 3: ↑3 и ↓0+3
Комментарии7

Доступен выпуск системы программирования PascalABC.NET 3.9.0, предлагающей редакцию языка программирования Pascal с поддержкой генерации кода для платформы .NET, возможностью использования библиотек .NET и дополнительными возможностями, такими как обобщённые классы, интерфейсы, перегрузка операций, λ-выражения, исключения, сборка мусора, методы расширения, безымянные классы и автоклассы. Проект главным образом ориентирован на применение в сфере образования и научных исследований. Сборка также включает среду разработки с подсказками по коду, автоформатированием, отладчиком, дизайнером форм и образцами кода для начинающих. Код проекта распространяется под лицензией LGPLv3.

Изменения в проекте:

  • подготовлена Linux-версия IDE PascalABC.NET;

  • добавлен модуль LightPT, обеспечивающий автоматическую проверку заданий, выполняемых учащимися;

  • добавлен модуль Мозаика для обучения дошкольников;

  • добавлен модуль TurtleWPF, реализующий черепашью графику на основе модуля GraphWPF;

  • в модуле Graph3D реализованы методы для работы в локальных координатах объекта;

  • в модуле Utils появилась функция Benchmark для замера времени работы участка кода;

  • на платформе Windows в окне вывода добавлена поддержка цветного вывода;

  • добавлены оптимизации (в несколько раз ускорена процедура Sort(a,x->x), ускорена работа с целыми числами в функции Abs, повышена эффективность применения атрибута [Cache]), разрешено использование именованных атрибутов при вызове подпрограмм.

    Источник: OpenNET.

Всего голосов 8: ↑8 и ↓0+8
Комментарии0

Мы в DotNetRu сообществе запустили новый открытый бесплатный курс "Rust для DotNet разработчиков".

Выходим онлайн по четвергам, неделю через неделю. Лекции можно посмотреть в записи по ссылке выше. Уже вышло 3 выпуска.

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

P.S.: курс действительно открытый, донатов не просим, ничего не рекламируем. Я просто готовил для Вуза аналогичный курс и решил поделиться с DotNet сообществом, немного адаптировав. А то одни бывшие плюсовики в Rust чатиках, а чем мы, шарписты, хуже?

Всего голосов 14: ↑14 и ↓0+14
Комментарии0

При установке .NET на линукс есть возможность использовать репозиторий либо официальный Ubuntu, либо от Microsoft (вариант со скриптом не рассматриваю)

Важный момент в том, что установка из этих 2 фидов происходит по-разному и в результате они могут конфликтовать

Принципиальное различие:

  • Ubuntu устанавливается в /usr/lib/dotnet

  • Microsoft устанавливается в /usr/share/dotnet

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

You must install .NET to run this application.

App: /home/user/repos/myapp/myapp
Architecture: x64
Host version: 7.0.0
.NET location: Not found

В итоге проблема оказалось следующей:

Исполняемый файл (запускаемый, не *.dll) пытается обнаружить путь до dotnetчерез переменную окружения DOTNET_ROOT

.NET из Ubuntu устанавливает ее равной /usr/lib/dotnet. Но для репозитория Microsoft, dotnet устанавливается в /usr/share/dotnet. После установки из нового фида, переменная не обновляется

Эту проблему я решил обновив файл /etc/environment - устанавливаю DOTNET_ROOT вручную. Теперь файл выглядит так

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin"
DOTNET_ROOT="/usr/share/dotnet"

Надеюсь, помог тем, кто столкнется с этим в будущем

Всего голосов 10: ↑10 и ↓0+10
Комментарии0

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

Работа

.NET разработчик
56 вакансий