Ответы пользователя по тегу C#
  • Как десериализовать объект с учетом значения свойства?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    На SO уже есть похожий вопрос.

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

    Код оттуда
    class MyItemConverter : JsonConverter
    {
        public override bool CanConvert(Type objectType)
        {
            return typeof(ItemToSell).IsAssignableFrom(objectType);
        }
    
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            JObject obj = JObject.Load(reader);
            string discriminator = (string)obj["ObjectType"];
    
            ItemToSell item;
            switch (discriminator)
            {
                case "apple":
                    item = new Apple();
                    break;
                case "books":
                    item = new Books();
                    break;
                case "melon":
                    item = new Melon();
                    break;
                default:
                    throw new NotImplementedException();
            }
    
            serializer.Populate(obj.CreateReader(), item);
    
            return item;
    
        }
    
    
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
    
        }
    }
    Ответ написан
    2 комментария
  • Какой командой можно посмотреть команды для создания С# приложений в VS Code?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    dotnet new --list
    Ответ написан
    Комментировать
  • Как можно инициализировать структуру в прямо в массиве в safe коде c#?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Сначала создает структуру на стеке, потом копирует ее в массив.


    Потому что сначала создается временная переменная с new User(1, 2), а потом она записывается в массив.

    Можно ли так сделать?


    Про так не знаю, но ты можешь использовать users.Initialize(). Он вызовет стандартный конструктор (без параметров) для всех элементов, а потом вручную выставить значения в цикле
    Ответ написан
    Комментировать
  • Почему CLR при генерации Машиного кода не оптимизирует циклы?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    На чем основывалась проверка? Какой инструмент?

    Во-первых, У .NET есть двухуровневая система генерации кода. Это Tiered JIT.

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

    P.S. именно поэтому BenchmarkDotNet делает очень много WarmUp, Preworkload и других стадий перед запуском реальных бенчмарков.

    Во-вторых, в какой конфигурации запускали: Debug или Release?

    Если Debug, то ничего удивительного нет - должны сохраниться изначальные строки, чтобы можно было пройтись дебагером. В Release получается каша, из которой ничего не понятно.
    Ответ написан
  • Почему в CoreCLR Int32.TryParse сделано не самым оптимальным образом?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Причина 1 (расширяемость)
    Если в будущем добавлять новые варианты NumberStyles, которые null должны обрабатывать иначе, либо какую-нибудь комбинацию, которая при null возвращает int.MinValue (например), то при проверке на null код сработает неправильно.

    Причина 2 (контракт)
    На вход всегда должны подаваться правильные данные. Очень странно, если будешь выполнять какую-либо работы с неправильными входными значениями.
    Я, например, всегда валидирую данные перед тем как выполнять работу.

    Причина 3 (легаси/совместимость)
    Может в старых версиях (.NET Framework) было такое поведение - исключение при неправильных данных
    Ответ написан
    2 комментария
  • Как правильно публиковать nuget packages с зависимыми проектами?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    1. Ссылаться нужно не на проект, а на другой пакет - тебе тогда надо публиковать 2 отдельных пакета

    2. Изменить .csproj так, чтобы в пакете был нужный .dll
    Ответ написан
  • Где можно посмотреть реализацию готовых и профессиональных WebAPI в связке с клиентом?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Microsoft создал референсный микросервисный проект - eShopOnContainers. Там есть основные паттерны проектирования, клиенты различные (ajax, mvc).

    А вообще, это только часть общего репозитория с проектами под различные кейсы - dotnet-architecture

    Если есть время, то можно и книгу прочитать по этой архитектуре
    Ответ написан
    Комментировать
  • Какой хостинг выбрать для ТГ бота на .Net?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Боты используют лонг-поллинг, поэтому DNS имя покупать/арендовать не надо, ровно как и платить за HTTP траффик приходящий (запросы). P.S. если ты на кол-беках делаешь, то надо.

    В данном случае подойдет любой хостинг, который поддерживает контейнеры.
    Такими могут служить:
    - Яндекс.Облако
    - Selectel
    - Hostinger
    - Digital Ocean

    и т.д. Просто вбиваешь - хостинг докер контейнеров.

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

    Лично я пользовался яндекс облаком - разворачивал полноценный Backend-Frontend на докеркомпозе. При регистрации дают бесплатные деньги (около 3тыс.)
    Ответ написан
    5 комментариев
  • В чем различие между Mutex и другими классами синх. потоков?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Зачем нужен Mutex? Есть ведь Monitor.

    Mutex - примитив синхронизации уровня ОС.
    Monitor - инструмент синхронизации уровня среды выполнения.
    Mutex это разве не тот же семафор, только который может брать один поток?

    Да, по внешним признакам. Но разве не лучше выделить специфичный кейс (как например в Mutex - одновременная работа только 1 потока) и оптимизировать работу для него, а не использовать везде обощенный инструмент (возможность для нескольких потоков в семафоре). Есть разные оптимизации для него.
    Ответ написан
    Комментировать
  • Как называть методы, которые не обрабатывают исключений?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    1. Есть Try* методы. Они возвращают bool - была ли операция успешна, а реальное возвращаемое значение передается через out параметр

    2. Внутри своих проектов я использую *Safe постфикс. Но использую я их только внутри класса и только для того, чтобы не писать TryGet*(out ...) конструкцию

    3. В док. строке можешь в какой-нибудь remarks секции указать, что метод не выкидывает исключение
    Ответ написан
    Комментировать
  • Как передать List из одного контроллера в другой через html-кнопку?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    resultString.AppendLine($"<button role=\"button\" class=\"sendBtn\"><a href=\"www.siteadress/api/reports/{serializedIngedientsList}\" style=\"text-decoration: none; color: #000000\"> Отчёт </a></button>");


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

    Почитай метанит
    Ответ написан
  • Почему не проходит Authorize?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Надо указывать схему авторизации.
    В атрибут Authorize добавить надо строчку схемы авторизации.

    [Authorize(JwtBearerDefaults.AuthenticationScheme)]
    Ответ написан
  • Как добавить сервисы и использовать их в контроллерах?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    builder.Services.AddScoped<IService, ServiceImplementation>();


    в Program.cs

    Потом через конструктор контроллера получаешь интерфейс.
    Ответ написан
    3 комментария
  • Как проверить в списке элементов типа string наличие двух одинаковых строк?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Используй HashSet. Если при Add вернет true - значит есть дубликат
    Ответ написан
    Комментировать
  • Как при сборки мусора и перемещении объекта, сохраняется корректность ссылок?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Управление памятью в .NET для профессионалов

    Как работает сборка мусора.
    В .NET используется 2 фазная сборка мусора: Mark & Sweep (Пометить и Убрать).

    Mark

    На этом этапе обходится весь граф объектов. И выявляются все недостижимые.

    Каким образом достижимость объектов определяется?

    Достижимые это:
    - Аллоцированные на стеке
    - В статических полях
    - Достижимые из достижимых (см. выше)

    Все объекты, которые не удалось достичь (в граф не попали) - являются недостижимыми.

    Но на стеке лежат числа. могут быть как числами, так и адресами, как и числами?

    JIT копилятор достаточно умный, чтобы сгенерить код, который будет знать, что за объект/ссылка лежит на стеке. Так и получаются знания об объектах.

    Sweep

    Тогда итог, что языки с сборщиком мусора, под в 2 раза медленнее должны быть.(помимо сборки)

    Вот тут интереснее. Есть несколько хаков как достигается большая производительность.
    1. Линеризованное пространство памяти.
    Адреса 0, 1 и 2 поколения расположены не абы где, а последовательно, друг за другом. Т.е. если нужно сократить пространство 0 поколения, то это означает простое передвигание указателя влево.

    2. Переход в след. поколение происходит не всегда
    Из 0 в 1 - переход быстрый, но из 1 в 2 - не всегда.
    На этом этапе тоже может не затрачиваться много времени.

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

    Теперь где-то, сборщик мусора, начинает переносить arr в другое место.

    Ты слишком большой массив выделил, он аллоцируется в LOH. Оттуда не вытащишь.

    Я много о чем не упомянул. Например, очередь финализации, таблица дескрипторов (Handle), сегментирование памяти и т.д. но ответы на основные вопросы дал
    Ответ написан
    2 комментария
  • Как грамотно переопределить метод на Generic?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Сделай как Task: вместо интерфейсов - конкретные классы.

    Это должны быть различные классы - один Generic (с возвращаемым значением), другой без.
    Для совместимости можешь добавить оператор приведения один к другому.

    В C# нет перегрузки по возвращаемому значению. В случае наследования интерфейсов (первый пример) ты создаешь метод и идентичной сигнатурой, но при этом различными возвращаемыми значениями. Вот он и ругается.
    Ответ написан
  • Почему в данном случае возникает ошибка: CS1503 Аргумент 1: не удается преобразовать из "UnityEngine. Quaternion" в "UnityEngine.Vector3"?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Дополняя ответ Василий Банников.

    - Vector3 - это вектор из 3 координат
    - Quaternion - это вектор из 4 координат

    Невозможно преобразовать, т.к. откуда знать что за 4-ая координата
    Ответ написан
  • Почему ParameterizedThreadStart не обощенный?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    - На C, чтобы запустить поток, аргумент потоку передается как void*. Это то же самое, что и object. Зачем пилить больше?
    - Ну сделаешь ты дженерик и что дальше? Другому потоку аргумент передается все равно по ссылке, а не через стек/регистры (как функции). Учи как работают потоки
    Ответ написан
    Комментировать
  • Почему не парсится JSON в Docker-контейнере?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    1) Может у вас прокси стоит, который заголовки удаляет?

    Логи говорят, что невозможно выполнить согласование контента (content negotiation).

    2) Попробуйте вручную зарегистировать Json форматтер для запросов первым с списке.

    В списке первым стоит `Microsoft.AspNetCore.Mvc.Formatters.HttpNoContentOutputFormatter`. Не работал с ним, но название говорит, что это какой-то Fallback класс, который просто скипает запрос
    Ответ написан
    Комментировать
  • Как подключить сторонню библиотеку с dll-ками к проекту .net core?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    В Rider это можно сделать через тот же самый Add Reference.
    Правая кнопка по проекту -> Add -> Reference... -> Внизу нажимаешь "Add from..." -> Находишь свой dll
    Ответ написан
    Комментировать