Ответы пользователя по тегу C#
  • Как получить всю БД в виде csv?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    С джоинами будет сложновато, но со всем остальным:
    1. Определяешь тип БД (раз уже подключился - значит известен)
    2. В большинстве СУБД можно динамически получить список всех таблиц/коллекций (эту информацию можно получить из служебных таблиц, имя и структура которых известна заранее)
    3. По данным из п2 делаешь N запросов SELECT * from {tableName} (как в монге это сделать - не подскажу)
    И через DataReader читаешь таблицу и пишешь в csv.

    А ещё для некоторых субд могут быть уже готовые инструменты для экспорта данных.
    Например mysqldump, pg_dump, mongodump итд, которые как раз и делают вышеописанное.

    На счёт джоинов - никогда подобное не видел, и в общем случае такое сделать не получится.
    Ответ написан
    Комментировать
  • Vs code или vs (для c#)?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Rider > VS > VS Code
    В VS Code поддержка C# реализована через omnisharp и пачку сторонних плагинов, что вместе работает не супер стабильно, да и денег команде Omnisharp явно не хватает, чтобы всегда успевать за обновлениями и добавлять какие-то ещё рефакторинги.
    VS даже в Community версии, даже без решарпера сильно удобнее.

    Если есть возможность - лучше взять подписку на JB Rider (моё мнение)
    Ответ написан
  • Как создать программу с методом, реализующий один из рекурсивных алгоритмов?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Ну вообще это задание, а не вопрос, в такой формулировке.
    Сумму можно посчитать так:
    public static int Sum(int[] numbers, int start, int count) {
      if(count < 0 || count > numbers.Length)
        throw new ArgumentOutOfRangeException(nameof(count));
      if(start < 0 || start >= numbers.Length || start + count > numbers.Length)
        throw new ArgumentOutOfRangeException(nameof(start));
      return count == 0 
        ? 0
        : numbers[start] + Sum(numbers, start+1, count-1);   // Вот тут наша рекурсия
    }

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

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Вычисления происходят быстро, просто у тебя 99% времени происходить вывод в консоль.
    Ответ написан
    Комментировать
  • Как на C# делать андроид игры (НЕ unity)?

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

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    enum SomeEnum {
      A,
      B
    }
    var text = "B";
    var enumValue = Enum.Parse<SomeEnum>(text); // SomeEnum.B


    PS: в .net standard < 2.1 и .net framework нет такого метода, зато есть
    var enumValue = (SomeEnum) Enum.Parse(typeof(SomeEnum), text);
    Ответ написан
  • Как отработают throw?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Здесь никак не отработают, тк блок try пуст.

    Но если бы что-то было, то:
    При выпадении CustomException исключение было бы подавлено.
    При выпадении любого другого - оно было бы проброшено дальше без изменений.
    До этих строк выполнение бы не дошло. О чём кстати любая IDE говорит
    throw ex;
    throw new MyEx(ex);

    Ну и гарантированно бы ещё выполнился блок finally после отработки всех catch-ей, но перед падением.
    61b9e108af4d3560067099.png
    Ответ написан
    Комментировать
  • На чем лучше делать маленькое API?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Не asp, а asp net core.
    В целом - почему нет? Для маленьких апишек в 6й версии даже новый синтаксис появился: ASP NET Core minimal api
    Ответ написан
    1 комментарий
  • Заполнить динамически экземпляр list?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    ну вообще не красивый код, но если прям очень нужно, то пиши так:
    var employeeList = objListList[0].Select(x=>x as Employee).ToList();

    Каст необходим, тк у тебя лист из объектов
    Ответ написан
  • Какая самая быстрая проверка на null?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Я проверил на 10 млн объектов и получилось что foo is null в 20 раз быстрее чем foo == null. Поэтому и интересно какой способ самый быстрый.

    Вы же в курсе, как нужно проводить тесты на производительность ?)
    foo == null, foo is null, ReferenceEquals(foo, null) - все они компилируются в одно и то же, по тому разницы никакой нет.
    Пояснение

    Вот код:
    public class Benchmark
    {
        private static readonly object? Obj = new();
        [Benchmark]
        public bool EqualityOperator() => Obj == null;
        [Benchmark]
        public bool PatternMatching() => Obj is null;
        [Benchmark] public bool ComplexPatterMatching() => Obj is not { };
        [Benchmark] public bool ConstantReturn() => false;
        [Benchmark] public bool EqualsCall() => Obj!.Equals(null);
        [Benchmark] public bool ReferenceEqualsCall() => ReferenceEquals(Obj, null);
    }

    Вот IL:
    .method public hidebysig instance bool
        EqualityOperator() cil managed
      {
        .custom instance void [BenchmarkDotNet.Annotations]BenchmarkDotNet.Attributes.BenchmarkAttribute::.ctor()
          = (01 00 00 00 )
        .maxstack 8
    
        // [10 39 - 10 50]
        IL_0000: ldsfld       object Benchmark::Obj
        IL_0005: ldnull
        IL_0006: ceq
        IL_0008: ret
    
      } // end of method Benchmark::EqualityOperator
    
      .method public hidebysig instance bool
        PatternMatching() cil managed
      {
        .custom instance void [BenchmarkDotNet.Annotations]BenchmarkDotNet.Attributes.BenchmarkAttribute::.ctor()
          = (01 00 00 00 )
        .maxstack 8
    
        // [12 38 - 12 49]
        IL_0000: ldsfld       object Benchmark::Obj
        IL_0005: ldnull
        IL_0006: ceq
        IL_0008: ret
    
      } // end of method Benchmark::PatternMatching
    
      .method public hidebysig instance bool
        ComplexPatterMatching() cil managed
      {
        .custom instance void [BenchmarkDotNet.Annotations]BenchmarkDotNet.Attributes.BenchmarkAttribute::.ctor()
          = (01 00 00 00 )
        .maxstack 8
    
        // [13 56 - 13 70]
        IL_0000: ldsfld       object Benchmark::Obj
        IL_0005: ldnull
        IL_0006: cgt.un
        IL_0008: ldc.i4.0
        IL_0009: ceq
        IL_000b: ret
    
      } // end of method Benchmark::ComplexPatterMatching
    
      .method public hidebysig instance bool
        EqualsCall() cil managed
      {
        .custom instance void [BenchmarkDotNet.Annotations]BenchmarkDotNet.Attributes.BenchmarkAttribute::.ctor()
          = (01 00 00 00 )
        .maxstack 8
    
        // [15 45 - 15 62]
        IL_0000: ldsfld       object Benchmark::Obj
        IL_0005: ldnull
        IL_0006: callvirt     instance bool [System.Runtime]System.Object::Equals(object)
        IL_000b: ret
    
      } // end of method Benchmark::EqualsCall
    
      .method public hidebysig instance bool
        ReferenceEqualsCall() cil managed
      {
        .custom instance void [BenchmarkDotNet.Annotations]BenchmarkDotNet.Attributes.BenchmarkAttribute::.ctor()
          = (01 00 00 00 )
        .maxstack 8
    
        // [16 54 - 16 80]
        IL_0000: ldsfld       object Benchmark::Obj
        IL_0005: ldnull
        IL_0006: ceq
        IL_0008: ret
    
      } // end of method Benchmark::ReferenceEqualsCall

    Тоесть в теории всё должно быть одинаково, кроме ReferenceEquals и ComplexPatternMatching. Но есть же ещё JIT и PGO. (надеюсь, что они не испортят результаты теста, и не превратят сравнение в константу)
    Блин, таки превратил в константу

    |                Method |      Mean |     Error |    StdDev |    Median |
    |---------------------- |----------:|----------:|----------:|----------:|
    |      EqualityOperator | 0.0000 ns | 0.0000 ns | 0.0000 ns | 0.0000 ns |
    |       PatternMatching | 0.0300 ns | 0.0164 ns | 0.0145 ns | 0.0271 ns |
    | ComplexPatterMatching | 0.0401 ns | 0.0327 ns | 0.0376 ns | 0.0267 ns |
    |        ConstantReturn | 0.0000 ns | 0.0000 ns | 0.0000 ns | 0.0000 ns |
    |            EqualsCall | 1.3787 ns | 0.0437 ns | 0.0409 ns | 1.3770 ns |
    |   ReferenceEqualsCall | 0.0000 ns | 0.0000 ns | 0.0000 ns | 0.0000 ns |


    Вот нормальный результат бенчмарка после засовывания поля в свойство и запрета на инлайнинг и оптимизацию этого свойства:
    |                Method |      Mean |     Error |    StdDev |
    |---------------------- |----------:|----------:|----------:|
    |      EqualityOperator | 2.5751 ns | 0.0062 ns | 0.0049 ns |
    |       PatternMatching | 2.5682 ns | 0.0073 ns | 0.0065 ns |
    | ComplexPatterMatching | 2.6456 ns | 0.0744 ns | 0.0696 ns |
    |        ConstantReturn | 0.0065 ns | 0.0044 ns | 0.0035 ns |
    |            EqualsCall | 4.6958 ns | 0.0337 ns | 0.0282 ns |
    |   ReferenceEqualsCall | 2.9525 ns | 0.0667 ns | 0.0557 ns |

    Тоесть все различия на уровне погрешности.
    А вот и JITAsm: sharplab


    PS: результаты бенчмарка не актуальны для Nullable, но там должно быть аналогично - только ReferenceEquals не стоит звать, и хз что будет при is not {}
    Так что я бы использовал is null либо == null
    PPS: если используется юнити - то там тоже не очень актуально, тк в юнити другой JIT, нет PGO, да и вообще может использовать IL2CPP
    PPPS: тут ещё подсказывают, что == может иметь неожиданное поведение из-за перегрузок операторов.
    Ответ написан
    6 комментариев
  • Как хранить переменную в сети c#(unity)?

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

    PS: Абстрактный вопрос = абстрактный ответ.

    PPS: Посмотрел на твои предыдущие вопросы: раз уже знаком с Flask, то почему бы не сделать на нём апишку и какой-нибудь базой данных?
    А на стороне юнити делать запросы через HttpClient
    Ответ написан
    Комментировать
  • Чем отличается язык программирования?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Могу ли я использовать свой опыт C# .NETFramework 4.8 в остальных реализациях?

    Да. Хотя не уверен, что у тебя есть какой-то значимый опыт, судя по вопросам.
    В интернете есть 3 версии языка программирования

    Версии самого C# идут от 1 до 10, включая ещё дробные 7.1 и 7.2
    А ты перечислил разные версии конкретных реализаций рантайма (mono, netcore, .net framework)
    Да и вообще сейчас актуальная - .NET 6 (без слова "framework")
    Ответ написан
    Комментировать
  • Как работает dispose в c#?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Нужно ли явно реализовывать логику уничтожения объекта?

    Да, но тк в твоём классе нет никаких ресурсов, которые нужно как-то по особенному освобождать - тебе этот интерфейс не нужен.
    Память, которую занимает твой класс, автоматически освободится силами GC, когда это будет необходимо.

    IDisposable необходим только тогда, когда ты используешь какие-нибудь внешние ресурсы, например файлы, сокеты, мутексы, и прочее.
    Ответ написан
    Комментировать
  • Как я могу конвертировать if?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    В общем случае нет - всё равно в каком-то месте у тебя будет вызываться по Input.GetЧтотоТам.
    И через цепочку if-ов и есть максимально эффективный вариант (если конечно ты проверяешь только те кнопки, которые есть смысл проверять)

    Но вроде как в Unity появилась какая-то новая система для инпута, которая должна быть гибче:
    https://gamedevbeginner.com/input-in-unity-made-ea...
    Ответ написан
    Комментировать
  • Как работать с файлами в C#?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Используй using при работе с файлами.
    using(var file = File.Create(path)) {
    // делаем все нужные дела через объект file
    } // а тут файл автоматически закроется

    Это аналогично питоновскому with

    Ну или можешь руками вызывать Close или Dispose, если в твоём случае using - не вариант.
    Кстати File.WriteAllText и так умеет создавать файл, если он не существует
    Ответ написан
    2 комментария
  • Какой компилятор c# выбрать?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    1. То о чём вы спрашиваете - это IDE, а не компилятор
    2. Компилятор C# только один актуальный - .NET 6

    Дизайнер винформ есть только в студии и rider
    MonoDevelop кстати тоже устарел, а в vscode форм нет.

    В принципе, ты можешь кодом формы редактировать, без дизайнера.
    Либо отказаться от форм в пользу какой-нибудь авалонии.
    Ответ написан
    Комментировать
  • Как в NameValueCollection добавить bool параметр?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Используй Dictionary<string, T>
    Ну или пиши так:
    var pars = new NameValueCollection();
    pars.Add("название параметра", true.ToString());
    Ответ написан
  • Как редактировать иерархию файлов?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Если речь про .net Core, то никак (на счёт .net fw почти уверен, что аналогично)
    Все зависимости кладутся в ту же папку, куда и исполняемый файл.
    Если бесит большое количество файлов библиотек в папке с екзешником - используй single file app:
    https://docs.microsoft.com/en-us/dotnet/core/deplo...
    Ответ написан
    Комментировать
  • Как округлить значение?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Берёшь и округляешь каждый отдельный компонент через Math.Round
    Ответ написан
    Комментировать