Ответы пользователя по тегу .NET
  • Как правильно тестировать базу данных в .NET?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    Вся логика выборок, фильтров и т.д. вынесена на уровень Storage Procedure, значит не получится создать тестовую БД с тестовыми данными.

    Это ещё почему? Во время прогона тестов поднимаете полноценную СУБД, которую заполняете всеми табличками и процедурами.
    Больше вариантов нет, если хочется этот слой протестировать.
    При наличии миграций - это не должно быть сильно сложно.

    В крайнем случае можно взять дамп продовой базы, вычистив все чувствительные данные.
    Ответ написан
    2 комментария
  • Что выбрать для CI/CD проектов на .net?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    Jenkins:
    - Бесплатный
    - Можно развернуть на Windows, что тебе нужно для net framework

    Ещё бы порекомендовал Teamcity - вроде первые несколько раннеров у него тоже бесплатные и он достаточно хорошо с .net интегрирован
    Ответ написан
    Комментировать
  • Почему всё выводится в одну строку?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    Потому что Console.Write(ch);
    В консоли всего один курсор => после всех переносов будет всё в одну строку писаться.
    Ответ написан
  • Как правильно инициализировать библиотеку классов в .NET?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист

    Чтобы данный сервис был доступен в окружении Lib.Controls, я реализую в этой библиотеке статический класс:

    Фатальная ошибка.


    Является ли такая архитектура единственно возможной или у нее есть достойные альтернативы?

    Раз у тебя уже есть DI, то следующий шаг прямо напрашивается. Создавать формы тоже при помощи DI и прокидывать все такие зависимости через конструктор.
    Ответ написан
    2 комментария
  • Почему net core потребляет много оперативной памяти?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    1. https://www.linuxatemyram.com/
    2. Особенности замера.

    Ну и 3:
    Даже если действительно на винде эта программа жрёт 11мб, а в докер-контейнере 200мб. Что это тебе даёт?
    Винда всё ещё будет отжирать минимум гиг, а линуксовое ядро будет болтаться около 100мб. И не забывай про п1 и 2
    Ответ написан
  • Есть ли консоль управления сайтами ASP.NET Core для Линукс'а?

    vabka
    @vabka Куратор тега ASP.NET
    Токсичный шарпист
    вообще нет, но можно попробовать упороться в автоматизацию:
    Вариант раз:
    Написать соответствующие скрипты для ansible.

    Вариант два:
    Контейнеризироваться и использовать кубер или хотябы голый докер.

    Вариант три, о котором я немного забыл:
    Octopus Deploy - ни разу не пользовался, но многие хвалят.

    Даже на винде трогать IIS Manager руками - не кошерно.
    Ответ написан
    4 комментария
  • Как сократить путь текущей директории в терминале?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    https://ohmyposh.dev/ или https://starship.rs/ поставь и будет у тебя нужный результат.

    Ну и тему нужно выбрать соответствующую.
    Ответ написан
    1 комментарий
  • Зачем нужен оператор fixed в c#?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    fixed запрещает перемещать объект в памяти.
    Сборщик мусора может и не соберёт объект, но без fixed он может его переместить и тогда указатель станет невалидным.

    stackalloc выделяет данные на стеке, а по тому с ним такой проблемы нет, ну и да - он не нагружает gc, хоть и обладает кое-какими другими потенциальными проблемами.
    Ответ написан
    3 комментария
  • Почему может не срабатывать финализатор при вызове GC.Collect?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    1. Финализация вполне может быть отложена по усмотрению сборщика мусора
    2. JIT вполне может так скомпилировать твой код, что вот этот = null будет опущен => при поиске ссылок, ссылка всё ещё будет на стеке.
    Попробуй вынести в новый метод и посмотреть там.

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

    PS: читаем внимательно документацию и особенно слова "не гарантирует"

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

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

    Сборщик мусора не собирает объекты с номером поколения, превышающим указанное параметром generation . Используйте свойство , MaxGeneration чтобы определить максимально допустимое generationзначение .

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

    Чтобы сборщик мусора отнимает объекты до указанного поколения объектов, используйте перегрузку GC.Collect(Int32) метода . При указании максимального поколения собираются все объекты.
    Ответ написан
    5 комментариев
  • Что плохого в использованиe в MethodImpl(MethodImplOptions.AggressiveOptimization)?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    Плохо тем что JIT будет нагружаться лишний раз там, где это не требуется.
    Лучше этим атрибутом помечать только очевидные hot path.
    Аналогично с агрессивным инлайнингом - только с ним ещё страшнее.
    Ответ написан
    Комментировать
  • Стоит ли углубленно изучать многопоточность, асинхронное и паралельное программирование?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    Хочется ответить цитатой:
    Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!
    Ответ написан
    Комментировать
  • Как в контроллеры привязывается CancellationToken?

    vabka
    @vabka Куратор тега ASP.NET
    Токсичный шарпист
    Если совсем боишься - можешь брать CancellationToken не из аргументов, а из контекста (HttpContext.RequestAborted)

    А подсовывает его тебе рантайм через процесс под названием model binding:
    https://learn.microsoft.com/en-us/aspnet/core/mvc/...
    Биндинг происходит чисто по совпадению типа и имя аргумента не влияет на него.
    Ответ написан
    5 комментариев
  • Как в линукс проверить, запущено ли net приложение?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    Можно к примеру попробовать создать Mutex указав его имя.
    Если удалось открыть - значит ещё не запущен второй экземпляр.
    Если не удалось открыть - значит уже запущен.

    Это по идее должно быть надёжнее, чем создавать файл.
    Вот рабочий код:
    using var globalMutex = new Mutex(false, "Global\\test_mx");
    var result = globalMutex.WaitOne(1000);
    Console.WriteLine(result ? "Owned" : "Not owned in 1s");
    Console.ReadLine();

    При попытке запустить сразу два экземпляра, в одном будет выведено: Owned, а в другом Not owned in 1s

    Префикс Global\ обязателен. Без него мутекс будет локальный для текущего процесса.
    Ответ написан
    3 комментария
  • Как при сборки мусора и перемещении объекта, сохраняется корректность ссылок?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    Если ты не используешь unsafe, то сборщик мусора сам все ссылки после передвижения поправит - ради этого он все managed потоки останавливает.

    Если ты используешь unsafe и передаёшь куда-то сырые указатели, то тогда тебе надо запинить объект чтобы гарантировать, что объект не будет перемещаться. Для этого, например, есть конструкция fixed, но оно работает только в рамках блока и одного потока.
    Ответ написан
    Комментировать
  • Как работает Object?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    Это особый класс, вот он и знает то, чего простым смертным не положено.

    Информация о типе хранится в самом начале экземпляра объекта - по тому даже не обязательно его как-то по особенному переопределять, чтобы что-то работало.

    Вот тебе ещё немного для взрыва мозга:
    Object - ссылочный тип.
    Все структуры - значимые типы.
    Но при этом все структуры каким-то образом наследуют от Object, хотя в обычной ситуации структуры вообще ни от чего наследовать не могут.

    UPD: а во втором случае всё работает, тк все объектынаследуются от object => происходит вполне легальный апкаст (или боксинг в случае int)
    Ответ написан
    2 комментария
  • Как правильно работать с npgsql при частых запросах к Postgres?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    Ты можешь спокойно убивать и пересоздавать Npgsqlconnection на каждый запрос, тк пулинг реализован на уровне Npgsql и он по-умолчанию включен.

    Это описано на первой же странице в документации:
    https://www.npgsql.org/doc/basic-usage.html#pooling

    Но советую уйти от сырого ADO.NET и взять какую-нибудь ORM-ку типа Dapper/linq2db/EF Core
    Ответ написан
    Комментировать
  • Как упаковать .NET в контейнер с приложением?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    В случае с .net (core) ты можешь собрать self contained приложение.
    https://learn.microsoft.com/en-us/dotnet/core/depl...

    В случае с net framework такого нет, но ты можешь просто вместе со своим приложением распространять инсталлятор net framework нужной версии
    Ответ написан
    9 комментариев
  • Какие есть библиотеки для работы с docx на dot net.cote (interop не работает на core)?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    Зависит от того, что именно нужно с docx делать.
    Есть npoi - для высокоуровневых абстракций, есть openxml SDK для низкоуровневых абстракций, есть templateengine для шаблонов.
    https://www.nuget.org/packages?q=Docx

    Да и интероп вроде тоже должен работать, но только на винде, и если офис установлен, и на десктопе, но не сервере.
    Ответ написан
    5 комментариев
  • Вопросы про .Net и Monobehavior. Как они работают?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист

    И как можно например выводить что либо на консоль не используя эту библиотеку(если конечно так можно)?

    Нельзя.


    Как работают методы такие как: Awake, Start, Update. Если точнее их вызывает главный скрипт Main и как работает Update?(while(true){}?)


    Вызывает сам юнити. Это детали реализации, о которых тебе думать не нужно.
    Update вызывается перед отрисовкой кадра.
    Если сделать while true, то всё зависнет.


    И еще один общий вопрос, можно ди взглянуть на их код?

    На стандартную библиотеку dotnet ты можешь посмотреть на сайте source.dot.net либо на гитхабе.

    На код юнити ты посмотреть не можешь, тк он проприетарный и написан на C++
    Ответ написан
  • Существует ли аналог VisualStudio для Android?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    Языки и технологии: C# WPF EntityFramework Windows

    С таким желаемым набором технологий единственный вариант - RDP к машине, где будет установлена студия.

    Если убрать Windows и WPF, а Entity Framework заменить на EF Core, то тогда можно попробовать Github Codespaces.
    Естественно, адекватно это можно будет использовать только на планшете с клавиатурой и мышью/трекпадом
    Ответ написан
    Комментировать