Задать вопрос
Ответы пользователя по тегу C#
  • На чем лучше делать маленькое API?

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

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

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

    Я проверил на 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)?

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

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

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

    Могу ли я использовать свой опыт C# .NETFramework 4.8 в остальных реализациях?

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

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

    Нужно ли явно реализовывать логику уничтожения объекта?

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

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

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

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

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

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

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

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

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

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

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

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

    Берёшь и округляешь каждый отдельный компонент через Math.Round
    Ответ написан
    Комментировать
  • Есть ли разница между is и Type.IsAssignableFrom?

    Нет, это не одно и то же.
    оператор is под капотом вызывает IL-инструкуцию isinst
    И работает она с экземплярами объектов.
    Test if obj is an instance of class, returning null or an instance of that class or interface.

    https://sharplab.io/#v2:C4LglgNgPgAgTARgLACgYGYAE9...
    https://en.wikipedia.org/wiki/List_of_CIL_instructions

    А Type.IsAssignableFrom - работает с экземпляром типа Type, и делает много сложных проверок:
    https://source.dot.net/#System.Private.CoreLib/Typ...
    Ответ написан
    2 комментария
  • Существует ли документация sfml для C#?

    Документации специально для шарпа нет.
    На русском языке документации также нет.

    Но в принципе там обёртка очень тонкая, по тому документация от плюсов актуальна - вместо геттеров/сеттеров будут свойства, а вместо pollEvent/waitEvent будут шарповые евенты.
    Ну и названо всё будет так, как должно быть в шарпе (с большой буквы).

    Если тебя устроит - можешь использовать исходники, как документацию: https://github.com/SFML/SFML.Net
    Ответ написан
  • C# Можно ли объявить внутри цикла "глобальные" переменные?

    Тебе нужен List
    // Заранее объявляем наш список
    var data = new List<int>();
    
    for(var i = 0; i < 10; i++) {
      data.Add(i); // В цикле добавляем в него значения.
    }
    
    // теперь у нас есть список data, в котором лежат числа от 0 до 9 (10 штук)
    // К ним в дальнейшем можно обратиться так:
    Console.WriteLine(data[0]); // Печатаем первое число из списка
    Console.WriteLine(data[9]); // Печатаем десятое число из списка.
    Console.WriteLine(data[^1]); // Обращаемся к первому с конца (последнему)
    Ответ написан
    3 комментария
  • Как исправить ошибку cs1519?

    У тебя скобки криво стоят.
    А конкретно у тебя if снаружи метода - скорее всего лишняя закрывающая скобка.

    Если нажмёшь кнопку "format document", то даже можно будет визуально увидеть, в каком месте всё ломается
    Ответ написан
    Комментировать
  • Почему дефолтном шаблоне один Program.cs вместо Program.cs и Startup.cs?

    Предположу, что вы увидели новый шаблон из .net 6:
    var builder = WebApplication.CreateBuilder(args);
    var app = builder.Build();
    app.MapGet("/", () => "hello world");
    app.Run();

    В .NET 6 ввели новый более компактный синтаксис, который заменяет Startup.cs.
    Гуглить по словосочетанию "asp net core minimal api"
    Если очень хочется - можете руками создать Startup.cs, его не удалили.
    Ответ написан
    2 комментария
  • Как запустить страничку на React из проекта ASP.NET?

    У тебя уже есть UseStaticFiles, так что должно работать.
    "страничка на реакте" запускается в браузере, так что от сервера необходимо только раздать файлы.
    https://docs.microsoft.com/en-us/aspnet/core/funda...
    Зачем JsEngineSwitcher и AddReact хз. Можно же просто на стороне IIS статику раздавать, не напрягая бэкенд (а можно вообще без IIS жить - нафига платить кучу денег на лицензию винды nginx)
    Ответ написан
    4 комментария
  • Почему Thread работает так?

    Это не тред виноват, а замыкания.
    Когда ты ссылаешься в лямбде на переменную - к ней обращение происходит по ссылке.
    Вот и получилось, что на момент запуска значение i уже 2.
    Решить эту проблему можно, если скопировать значение i в новую переменную вот так:
    for (int i = 0; i < 2; i++)
    {
        var i2 = i;
        Thread thread = new Thread(() =>
        {
            Console.WriteLine("main index: " + i2);
        });
        thread.Start();
    }
    Ответ написан
    Комментировать
  • Стоит ли использовать в одном проекте EF Core и Dapper?

    Да, это очень распространённый Паттерн, и так даже в больших проектах делают.
    Но Join с OrderBy можно и на EF написать

    Но советую посмотреть на linq2db.
    С ним можно даже сложные запросы с CTE и оконными функциями на linq писать
    И у него нет такого оверхеда, как у EF.
    Из минусов - нет встроенного механизма для миграций.

    Но вроде есть пакет для интеграции с EF - можно описывать схему и накатывать миграции при помощи EF, а запросы писать с linq2db
    Ответ написан
    Комментировать