Ответы пользователя по тегу C#
  • Чем отличается Regex.Replace(...) от string.Replace(...)?

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

    Чем отличается Regex.Replace(...) от string.Replace(...)

    Regex.Replace использует регулярные выражения для поиска того, что надо заменить.
    string.Replace же ищет только по точному совпадению.

    Соответственно, если переменная initial будет содержать какие-то специальные символы (например *, + и ?), то их поведение будет различаться.
    Ответ написан
  • Как получить имя сервера Discord.Net?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Когда пользователь вызывает команду, к тебе на сервер приходит запрос (на вебхук), где указан guild_id, в которой команда была вызвана.
    https://ptb.discord.com/developers/docs/interactio...

    Получить подробную инфу о сервере по guild_id можно соответствующим методом:
    https://discord.com/developers/docs/resources/guil...
    Ответ написан
  • Есть ли аналоги корутин Unity в языке c# и как их использовать?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    На сколько я знаю, корутины в Unity реализованы через IEnumerator и объекты WaitForSeconds.

    IEnumerator и IEnumerable - это стандартные интерфейсы, которые используются для реализации перечислений/коллекций и итераторов.

    А вот ожидание в C# ты можешь получить через метод Thread.Sleep (в синхронных методах) или await Task.Delay (в асинхронных методах).
    Ответ написан
    9 комментариев
  • Где взглянуть на C# проект с "эталонной" архитектурой?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    В общем, условно, такой код, глядя на который, даже самые суровые критики не могли бы найти к чему придраться.

    Всегда можно к чему-то придраться.
    Качество архитектуры можно понять только в динамике - легко ли вносить изменения в продукт, или сложно.
    А так есть eShopOnWeb и eShopOnContainers
    Ответ написан
    Комментировать
  • Как inject Generic interfaces?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Чтобы можно было резолвить обобщённые интерфейсы, тебе нужно их зарегистрировать. Всё также, как и с необобщёнными интерфейсами:
    services.AddScoped(typeof(IFoo<>), typeof(Foo<>));

    Чтобы твой контроллер мог принимать в себя обобщённый интерфейс как параметр - сам контроллер должен быть обобщённым.
    Но тут сразу возникает проблема с тем, как маршрутизировать к такому контроллеру. По тому просто так нельзя так сделать.
    Ответ написан
    Комментировать
  • Как корректно получить данные из SqliteDataReader?

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

    sqlCommandText = "SELECT * FROM table WHERE id='"+Id+"'"; // Смущает +Id+, так вроде не пишут, нужно @?


    Правильно, что смущает.
    1. SELECT * лучше не писать. Лучше писать конкретные поля, которые тебе нужны
    2. Вместо конкатенации следует использовать параметризованные запросы. При использовании EF Core и Dapper их можно делать через интерполяцию, но тут придётся ручками добавлять параметры в свойство Parameters

    using var command = new SqliteCommand
    {
        CommandText = "SELECT id, txt, floating_point, raw_bytes FROM table WHERE id=$id",
        Parameters = {
          new SqliteParameter("$id", 123)
        },
        Connection = new SqliteConnection() // Тут стоит подставить настоящий connection
    };
    
    using var reader = await command.ExecuteReaderAsync(); // Вместо async-await можно использовать и синхронные методы
    var data = new List<(int id, string text, double floatingPoint, byte[] blob>(); // Вместо кортежа можно нормальный тип
    while (await reader.ReadAsync())
    {
      var id = await reader.GetFieldValueAsync<int>(0); //integer
      var text = await reader.GetFieldValueAsync<string>(1); //text
      var value = await reader.GetFieldValueAsync<double>(2); // real
      var blob = await reader.GetFieldValueAsync<byte[]>(3); // blob
      data.Add((id, text, value, blob));
    }
    Ответ написан
    4 комментария
  • Какой паттерн использовать?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Шаблонный

    Шаблонный что?
    итератор

    А что ты итерировать собрался?

    Не нужно тут придумывать название паттерна и пытаться по нему решить задачу.
    Сама задача решается тупо рекурсивным проходом по всем подпапкам.
    В зависимости от того, как конкретно ты будешь это реализовывать, будут наблюдаться разные паттерны.
    Ответ написан
    Комментировать
  • Spring или Asp.net core для будущей работы?

    vabka
    @vabka Куратор тега ASP.NET
    Токсичный шарпист
    Зарплаты примерно и там и там если не одинаковые, то очень близкие.
    Вакансий на Java/Spring больше, чем на C#/ASP NET Core, но во втором случае и конкуренции меньше. В целом проблем с поиском работы нет.

    Я буду жабой, которая хвалит своё болото и предложу углубиться в ASP.NET Core.
    Мне C# кажется более перспективным языком и платформой чем Java. (хотя ещё я бы посмотрел на Kotlin)

    Но тебе всё равно следует посмотреть ситуацию на конкретно твоём рынке труда и принять окончательное решение.
    Учитывай, что ситуация за 3-4 года 10 раз может поменяться.
    Ответ написан
    2 комментария
  • Можно ли получить тип интерфейса, переданного в дженерик-метод и правильно ли использовать его таким способом?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Ну ты можешь сделать так:
    switch(parameter) {
      case IPrintService_IncomeProductLabelParams incomeProductLabel: {
        // ...
        break;
      }
      case IPrintService_WLabelParams wLabel: {
        // ...
        break;
      }
      // итд
      default:
        // ...
      break;
    }

    Но мне не понятен смысл женерика и интерфейсов с пропертями.
    Ты собираешься делать параметры ещё и структурами?
    В принципе тут можно избавиться от интерфейсов вообще и оставить только конкретные классы, а в IPrintService сделать несколько перегрузок, например.
    Или сделать по интерфейсу для каждого типа этикеток.

    Вообще, я у тебя тут вижу три разные вещи у этикеток:
    1. Какой принтер используется (PrinterName)
    2. Параметры задания на печать (Copy)
    3. Параметры самой этикетки. Её тип и, например, SKU товара.
    Попробуй подумать с этой стороны.
    Например ты можешь сделать такой IPrinter, который будет принимать в себя PrintTask, у которого будет написано количество нужных копий и Payload который будет уже самой этикеткой.
    Конкретная реализация IPrinter может быть привязана к одному физическому принтеру.

    А Payload ты можешь формировать отдельно от сервиса печати. Например у тебя может быть какая-нибудь "служба шаблонов этикеток", в которую ты передаёшь объект с параметрами этикетки, а она отдаёт тебе уже сформированный объект этикетки, который пригоден для печати (Что там вообще принтер принимает? Картинку?)
    Ответ написан
  • Как в LibGit2Sharp сделать клон репозитория с заменой файлов?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Вариант раз: Удалить старую папку и сделать git clone.
    Вариант два: Создать новую временную папку и скопировать из неё всё содержимое. Но что делать с самим репозиторием в таком случае - не ясно, как и то, что делать, если файлы есть в обоих папках.
    Вариант три: Как сказал oleg_ods - использовать git pull, чтобы обновить существующий репозиторий
    Вариант четыре: Создать новую папку, чтобы её имя не совпадало со старой, и клонировать репозиторий в неё.
    Ответ написан
    4 комментария
  • Считать ли класс, который реализует extern-методы, адаптером?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Сложно сказать, есть ли у такого паттерна название. А это важно?
    Подобные штуки обычно обёртками называют
    Ответ написан
  • Где можно посмотреть проекты близкие к реальным по ASP.NET?

    vabka
    @vabka Куратор тега ASP.NET
    Токсичный шарпист
    eshoponweb и eshoponcontainers.
    Ещё, думаю, можешь посмотреть на какие-нибудь опенсорсные проекты. Например на SunEngine
    Ответ написан
    Комментировать
  • Как стримить кучу картинок с минимальной латенси?

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

    Захватывать картинки - есть либа и это вроде не сложно, но с веб апи я работал с обычными запросами, если я буду отправлять 24 картинки в секунду, даже разрешения 640 на 480 через пост запросы, это, блин, очень много запросов ) там не известно, какие-то кадры могут раньше приехать, какие-то зависнуть по разным причинам.

    Я бы посмотрел в сторону grpc streaming - там можно 1 раз открыть соединение и отправлять много сообщений + не нужно в base64 кодировать.
    Либо вообще подумал над собственным протоколом поверх tcp.

    Ещё в raspberry вроде есть аппаратный кодировщик видео - вероятно видео будет транслировать более эффективно, тк врядли между соседними кадрами будет очень большая разница, но как именно можно принять видео на стороне дотнета - хз. Возможно нужно будет ещё одно какое-то приложение поднять, которое будет читать поток видео и сохранять его в виде картинок.

    Нашёл ещё вот такую статью:
    https://www.codeproject.com/Articles/810004/Live-V...
    Ответ написан
    2 комментария
  • Mapping со сложной структурой?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    User user = null!;
    var userDto = new AllUserDataDto {
      TelegramUserIdDto = user.TelegramUserId,
      Steam = user.Accounts.Select(x => 
          new Steam {
            SteamIdDto = x.SteamId,
            Skins =  x.Items.Select(i=> new Skin { NameDto = i.MarketHashName  }
        })
        .ToList()
    };


    Кстати, а какой сакральный смысл в добавлении суффиксов Dto к именам свойств?
    Ответ написан
  • Как заоверлоудить Join одного параметра?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    На самом деле тебе нужен string.Join(",", source)
    Ну либо тебе нужен вот такой екстеншен:
    public static class StringExtensions {
      public static string Join<T>(this IEnumerable<T> parts, string separator) => 
        tring.Join(separator, parts);
    }
    Ответ написан
    Комментировать
  • Как из сайта по ссылке засунуть его в приложение на c#?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Тебе нужно сделать десктопное приложение при помощи Winforms, WPF, или Avalonia, и добавить в окно Webview, в котором открыть этот сайт.

    Добавить webview ты можешь при помощи Webview2 или CEF
    Ответ написан
    1 комментарий
  • Как отследить выход из игры UNITY?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Столкнулся я с вопросом "А как узнать, что игрок закрыл игру принудительно, не используя кнопку "Exit"?

    Ну например ты можешь при нормальном закрытии записывать какой-нибудь флаг в файл, типа "игра была закрыта нормально".
    Тогда при следующем запуске, обнаружив, что этот флаг не стоит - ты поймёшь, что в прошлый раз игра закрылась непредвиденным образом (принудительно или из-за отключения электричества)

    Также, было бы весело решить данный вопрос, если вы ответите на похожий вопрос "Как узнать время проведенное в афк?",

    Ну тут тебе сначала нужно дать определение, что такое афк в твоём случае :)
    К примеру, можно считать, что игрок отошёл, если от него не поступает сигнал N единиц времени.
    Тогда чтобы узнать время нахождения в афк - тебе нужно просто сохранять метку времени каждый раз, когда игрок как-то взаимодействует с игрой, а потом отнимать от последнего записанного времени N.
    Ответ написан
    2 комментария
  • Зачем нужен IHost и когда его полезно использовать в desktop-приложениях?

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

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

    Как попытка унификации - да.
    Как попытка упростить межсервисное взаимодействие - нет.

    Главная задача IHost - упростить конфигурацию приложения и управление жизненным циклом (тот же graceful shutdown например тебе даётся из коробки, если ты используешь IHost)
    + Сразу автоматически получаешь преднастроенный IConfiguration, логирование и DI
    Ответ написан
    2 комментария
  • Можно ли вместо Delete-метода использовать POST?

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

    Если бы серверную часть писал я, то я бы подумал над редизайном этой апишки, ибо принимать кучу query-параметров для удаления - это странно и не соответствует идеям rest.
    Ответ написан
    Комментировать