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

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Например так:
    var line = Console.ReadLine();
    var items = line.Split(' ');
    var a = int.Parse(items[0]);
    var input = char.Parse(items[1]);
    var b = char.Parse(items[2]);
    Ответ написан
    2 комментария
  • Что за тип Unit в Haskel Rust Kotlin? Чем отличается от Void?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    void означает, что функция ничего не возвращает. Такие функции не получится использовать в выражениях и их результат нельзя никуда присвоить. Из-за этого многие обобщённые вещи приходится писать по два раза: один раз для обычных функций и ещё раз для функций, которые возвращают void.
    Такие функции ещё называют процедурами.

    unit же напротив является значением, просто всего с одним возможным вариантом. Компиляторы часто его оптимизируют так, что он занимает 0 байт и не требует никаких инструкций для передачи. То же самое с указателем на юнит.


    Можно ли увидеть аналог пример кода на c# java с этим типом?

    Нельзя, тк в их системе типов такого типа просто нет. Можно его имитировать при помощи пустой структуры например.
    Но в мире дотнета есть f#, а в мире жавы - скала и котлин.

    А еще, вот к примеру я придумал, почему нету(может этот тип и есть), К примеру в c# есть понятие Boxing типов при касте через object
    int a=(int)(object)1;
    Что довольно дорого и долго. С выделением памяти в куче.
    А почему нету Типа, который ни чего не упаковывает, а просто передает двойное машинной слово? Ведь это прекрасно покроет все простые структурные типы, int char double., Enum, кортежи в 8 байт. А все остальное уже как объект.

    1. А что делать если тебе боксинг явно нужен?
    2. А где ты будешь метаданные передавать? Как в такой ситуации отличить тот же long от ссылки на объект?
    3. По спецификации передаётся ссылка, а не двойное машинное слово.

    И каким боком боксинг имеет отношение к юниту?
    Ответ написан
    3 комментария
  • Что плохого в использованиe в MethodImpl(MethodImplOptions.AggressiveOptimization)?

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

    vabka
    @vabka Куратор тега ASP.NET
    Токсичный шарпист
    В реальном времени ты в html так их не вставишь.
    У тебя два варианта:
    1. Если стрим конечный, то ты можешь собрать все айтемы в лист и вернуть его как обычно.

    2. Использовать websocket - тут надо будет подумать, как лучше это подружить со сложившейся у тебя архитектурой.
    Как минимум нужно будет добавить js на фронт и создавать долгоживущую задачу на бэке
    Ответ написан
    2 комментария
  • Как собрать ядро linux которая развертывает C# приложение?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Используй systemd для этого.

    Если приложение графическое, то используй какой-нибудь kiosk mode.
    Ответ написан
    6 комментариев
  • Какой командой можно посмотреть команды для создания С# приложений в VS Code?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    https://learn.microsoft.com/ru-ru/dotnet/core/tool...

    dotnet new --list
    dotnet new --help
    dotnet new template --help
    Ответ написан
    Комментировать
  • Как можно инициализировать структуру в прямо в массиве в safe коде c#?

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

    То есть происходит лишние выделение на стеке память.

    Это на столько мизерное выделение, что я даже хз.

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

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

    еще заметил циклы не разматываются

    С чего взял? Вроде в core 3.1 добавили разматывание циклов.
    Но циклы разматываются очень редко, тк можно стек порвать

    Рекомендую посмотреть доклад от Егора Богатова: https://m.youtube.com/watch?v=H1ksFnLjLoY и статьи от него. Сейчас он работает в ms и как раз занимается jit-ом.

    Ещё можно задать какие-нибудь вопросы напрямую в чате https://t.me/pro_net
    Ответ написан
    Комментировать
  • Как работать с ArrayPool, Откуда утечки?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Так в этом же и суть пула: выделить много памяти один раз и переиспользовать её много раз.
    Тем более что ты взял Shared пул, а не создал новый - вот он и не освобождает память
    Ответ написан
    Комментировать
  • Как запустить сайт на С# в Ubuntu 20.04?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    https://learn.microsoft.com/ru-ru/aspnet/core/host...

    Как именно собирался он? На убунте ты сможешь запустить приложение только если используется .NET 5+ или Core, но не .NET Framework.

    Для этого тебе нужен соответствующий рантайм:
    https://learn.microsoft.com/en-us/dotnet/core/inst...
    Ответ написан
    3 комментария
  • Почему Unity выдаёт ошибки CS0103 и CS0029?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Ну давай на конкретных примерах:
    void OnMouseUp()
      {
        if(door_handle) door_handle.transform.localRotation = handle_start_rot;
      }

    Вот тут у тебя используется handle_start_rot, но при этом у тебя нет полей с таким именем. Что ты на самом деле хотел использовать?
    Тут либо опечатка, либо ты забыл поле добавить, либо хотел использовать что-то из другого класса, верно?

    Далее:
    if(door_axis = door_axis_ENUM.X) // 85
              {
                float posX = Mathf.MoveTowards(transform.localPosition.x, start_dist_or_angle, open_speed * Time.deltaTime);
                transform.localPosition = new Vector3(posX, transform.localPosition.y, transform.localPosition.z);
                if(transform.localPosition.x == start_dist_or_angle + open_dist_or_angle) Stop_open_close();
              }

    Тут очевидно, что ошибка в том что у тебя один знак равно, а должно быть два, тк ты явно хотел сделать сравнение, а не присваивание, по аналогии с соседними ветками if-else

    Далее:
    else if(door_axis = door_axis_ENUM.Z)
              {
                float angleZ = Mathf.MoveTowardsAngle(transform.localEulerAngles.z, start_dist_or_angle + open_dist_or_angle, open_speed * Time.deltaTime);
                transform.localEulerAngles = new Vector3(0, 0, angleZ);
                if(transform.localEulerAngles.z == start_dist_or_angle + open_dist_or_angle) Stop_open_close();
              }


    То же самое.

    Что какой из этих пунктов был тебе не понятен, когда ты перечитывал код и почему?
    Ответ написан
    1 комментарий
  • В чем различие между Mutex и другими классами синх. потоков?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    В отличие от Monitor, класс Mutex может использоваться для межпроцессной синхронизации. Для этого нужно использовать именованный мьютекс, который виден в операционной системе. Чтобы создать экземпляр именованного мьютекса, используйте конструктор Mutex, который задает имя. Также можно вызвать метод Mutex.OpenExisting, чтобы открыть существующий именованный системный мьютекс.

    Думаю, этого достаточно для понимания различий.

    Mutex это разве не тот же семафор, только который может брать один поток?

    Нет, не тот же.
    Как минимум, если говорить про .NET, то Mutex имеет одну фичу, которого нет у Semaphore:
    Mutex можно использовать для синхронизации между процессами (при помощи именованного mutex) на Linux, а Semaphore нельзя.

    На уровне ОС семафор и мутекс - это разные вещи. Предположу, что это позволяет немного оптимизировать реализацию, зная заранее, что у тебя будет только 1 поток, который его держит.
    Ответ написан
    Комментировать
  • Как называть методы, которые не обрабатывают исключений?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Их не принято никак по особенному отмечать.
    Ответ написан
    2 комментария
  • .Net 6 где хранить настройки?

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

    1. Собственно настройки
    Их удобнее всего хранить в appsettings.json, который можно спокойно закоммитить в репозиторий.
    В коде можно получить к ним доступ через IConfiguration или IOptions

    2. Секреты (пароли, токены, итд)

    Строку подключения в общем то решил захардкодить.

    Остается имя админа и пароль + почта.

    Их лучше в репозитории не хранить.
    Благо IConfiguration можно наслаивать и прокидывать секреты через переменные окружения, например, или использовать какой-нибудь Vault или keyring.
    Уже упомянутый диспетчер секретов можно использовать только для разработки, но не для прода.

    3. Фича-флаги.

    Дальше динамическая смена настроек как то:
    OAUTH авторизация, которую выключать и включать можно.

    Их часто хранят в базе данных, да. Есть также несколько уже готовых решению для удобного управления фича флагами.
    Гуглить feature flags.
    https://learn.microsoft.com/en-us/azure/azure-app-...

    4. Если есть конфиги, которые нужно менять на лету, то тут нужно уже смотреть, как именно нужно отрабатывать изменение конфигов.
    Например мы храним такие конфиги в etcd и явно подписываемся на изменения. В случае изменений - делаем какие-то действия.

    В дотнете для работы с такими конфигами есть интерфейс IOptionsMonitor
    Ответ написан
    1 комментарий
  • Как проверить в списке элементов типа string наличие двух одинаковых строк?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Под капотом в любом случае всё упрётся в цикл.

    Если просто синтаксический не хочешь видеть цикл, то .Distinct().Count() и сравни с длиной исходного списка.

    Но по хорошему лучше пойти путём AshBlade

    И вообще если обязательна уникальность элементов - изначально работать с HashSet, а не List
    Ответ написан
    2 комментария
  • Как в контроллеры привязывается 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, но оно работает только в рамках блока и одного потока.
    Ответ написан
    Комментировать
  • Почему в данном случае возникает ошибка: CS1503 Аргумент 1: не удается преобразовать из "UnityEngine. Quaternion" в "UnityEngine.Vector3"?

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

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    fixed(TestStruct*ptrT = &t){ 
              tS = ptrT; 
          }

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

    В твоём случае я вообще не вижу необходимости в хранении указателей на структуру и в unsafe вообще- ты можешь просто копировать её, тк она не очень большая.
    Ответ написан
    1 комментарий