Ответы пользователя по тегу C#
  • Откуда у делегатов метод Invoke?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Во время компиляции создается класс, наследующийся от MulticastDelegate. Там и определяются.

    StackOverflow

    Делегат:
    namespace ConsoleApp;
    
    public delegate int Factory();


    IL код
    // Type: ConsoleApp.Factory 
    // Assembly: ConsoleApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
    // MVID: 158825C2-2E1C-449E-A72A-66768D48C2ED
    // Location: /home/user/RiderProjects/ConsoleApp/ConsoleApp/bin/Debug/net6.0/ConsoleApp.dll
    // Sequence point data and variable names from /home/user/RiderProjects/ConsoleApp/ConsoleApp/bin/Debug/net6.0/ConsoleApp.pdb
    
    .class public sealed auto ansi
      ConsoleApp.Factory
        extends [System.Runtime]System.MulticastDelegate
    {
    
      .method public hidebysig specialname rtspecialname instance void
        .ctor(
          object 'object',
          native int 'method'
        ) runtime managed
      {
        // Can't find a body
      } // end of method Factory::.ctor
    
      .method public hidebysig virtual newslot instance int32
        Invoke() runtime managed
      {
        // Can't find a body
      } // end of method Factory::Invoke
    
      .method public hidebysig virtual newslot instance class [System.Runtime]System.IAsyncResult
        BeginInvoke(
          class [System.Runtime]System.AsyncCallback callback,
          object 'object'
        ) runtime managed
      {
        // Can't find a body
      } // end of method Factory::BeginInvoke
    
      .method public hidebysig virtual newslot instance int32
        EndInvoke(
          class [System.Runtime]System.IAsyncResult result
        ) runtime managed
      {
        // Can't find a body
      } // end of method Factory::EndInvoke
    } // end of class ConsoleApp.Factory
    Ответ написан
    Комментировать
  • Как называются и зачем нужны такие штуки [field:]?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Это цели атрибутов - то для чего атрибут предназначается.
    RTFM
    Ответ написан
    Комментировать
  • Что за тип Unit в Haskel Rust Kotlin? Чем отличается от Void?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Можно ли увидеть аналог пример кода на c# java с этим типом? Как-то наглядно продемонстрировать отличие от void. Иначе никак не пойму?


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

    Если хочешь в дотнете - то иди в F#. Там есть Unit, попробуй функциональное программирование.

    А почему нету Типа, который ни чего не упаковывает, а просто передает двойное машинной слово?


    Это long. Передавай везде его, а внутри делай каст/приведение. А вообще, зачем делать стек еще больше? Если надо передать только байт, ты предлагаешь передавать сразу 8?

    кортежи в 8 байт.


    Где кортежи в 8 байт?


    // почему такого нету, вроде же легко можно добавить, я куча раз сталкивался,
    // когда дженерик писать прям в лом, или большие изменения внесет, или еще что,
    // а передать надо byte int double


    Используй ограничения на дженерики - where тебе в помощь
    Ответ написан
    Комментировать
  • Что плохого в использованиe в MethodImpl(MethodImplOptions.AggressiveOptimization)?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Во-первых, каждый раз это писать утомишься.
    Во-вторых, в .NET умный алгоритм оптимизации, если надо будет он оптимизирует сам.
    В-третьих, оптимизация ресурсоемкий процесс. В данном случае все быстро произошло. А теперь представить огромный проект на несколько миллионов строк кода, где некоторые части вообще не используются либо запускаются только 1 раз. Все они должны будут оптимизироваться самым ярым образом.

    В итоге: никто не запрещает его везде использовать, просто это "Экономически" не выгодно
    Ответ написан
    Комментировать
  • Как получить внешний API в Web API C#?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Используй GetFromJsonAsync<T>(url) метод у HttpClient.

    В T указываешь объект, который нужно десериализовать, а в url - адрес, по которому нужно послать запрос. Для httpbin, например
    client.GetFromJsonAsync<SomeObject>("httpbin.org/get");


    Класс объекта создаешь сам.

    Туториал на метаните
    Ответ написан
    1 комментарий
  • Как реализовать SQL движок в своём приложении?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    1. GraphQL - специальный язык запросов. Можно изменять/обновлять/добавлять/читать. Есть полноценный пакет, который парсит запрос и выполняет его. Можно к In memory коллекциям подкрутить. Но это не SQL

    2. OData - тоже язык запросов. Можно изменять/добавлять/читать/удалять. Он достаточно старый и разобраться сложнее. Тоже есть фреймворк, который автоматизирует работу по парсингу/выполнению. Это также не SQL

    3. In Memory sqlite - можно запустить SQLite в памяти и проксировать запросы уже ему.
    Ответ написан
    Комментировать
  • Как десериализовать объект с учетом значения свойства?

    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 - значит есть дубликат
    Ответ написан
    Комментировать