• Какая самая быстрая проверка на 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 комментариев
  • Как запустить страничку на React из проекта ASP.NET?

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

    @d-sem
    Так как резюме не приложено, то придется строить догадки.

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

    Джун должен уметь то, что требуют на вакансии.

    Ну и обычно HR аргументируют свой отказ.
    Ответ написан
    Комментировать
  • Можно ли написать веб-приложение на C#, схожее с финансовыми веб-приложениями?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Конечно реально. Сделать можно с помощью чего угодно.
    Ответ написан
    Комментировать
  • Как обрабатывать события в asp.net?

    vabka
    @vabka Куратор тега ASP.NET
    Токсичный шарпист
    В MVC -никак.
    На js ловишь события, и отправляешь http-запросы к твоему бэкенду.
    Через XMLHTTPRequest, fetch, или $. ajax
    Либо через отправку форм - тут аналогично, просто уже через form, а не через js

    Можно с полной перезагрузкой страницы, а можно ajax
    Ответ написан
    Комментировать
  • Стоит ли уволняться для поиска работы java разработчиком?

    saboteur_kiev
    @saboteur_kiev Куратор тега Карьера в IT
    software engineer
    Все адекватные работодатели:

    1. Задают вопрос "когда вы готовы приступить к обязанностям", и 2 недели по КЗОТ это вообще минимальный стандарт. А так могут и месяц подождать, вполне адекватно отнесясь к тому, что после увольнения вы хотите взять небольшой отпуск, например. Но это вполне обговариваемо с работодателем.

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

    3. Успешное прохождение интервью это еще не означает хороший оффер. Вам может не понравиться компания, не понравятся условия или ЗП или начальник с которым вы собеседуетесь. Не нужно думать что если пошел на собеседование то это точка невозврата. Точка невозврата это даже не подтверждение оффера. Даже увольнение еще можно откатить в некоторых случаях. Нет смысла волноваться по таким поводам.

    4. Многие ходят на собеседование даже не предполагая менять работу. Кто-то из спортивного интереса, кто-то на всякий случай посмотреть, а вдруг предложат работу мечты. В таких случаях всегда бывает, что сотрудника нужно ждать и месяц и два. Но такие варианты, конечно, встречаются в основном на уровне mid/senior и выше.
    Ответ написан
    Комментировать
  • Стоит ли уволняться для поиска работы java разработчиком?

    Jacen11
    @Jacen11
    вот скажи, зачем тебе мнение хрен пойми кого, если ты можешь сам пройти собеседования и все узнать? сейчас даже идти никуда не нужно, все удаленно проходит. Сразу отпадут все вопросы после первых же собесов, поймешь что спрашивают, что им нужно, на что смотрят и тд. На эти темы можно писать целые статьи и в общем то пишут, тут никто детально все равно расписывать не будет. Или ты думаешь что тебя укусят на собесах? В питере много вакансий, ты никогда не сможешь на все сходить чисто физически, можно пробовать сколько угодно
    Ответ написан
    Комментировать
  • Цель - WEB Full-stack. Сносный ли план обучения для новичка?

    vabka
    @vabka Куратор тега Веб-разработка
    Токсичный шарпист
    Если бы это был вопрос "хороший ли это роадмап для asp net разработчика", то я бы сказал, что это отличный роадмап (за исключением питона, php, фриланса, и в принципе порядка изучения).
    Многое можно учить параллельно (английский)
    Что-то можно отложить (копание в алгоритмах)
    Ну и на счёт источников знаний не уверен - те же "Грокаем Алгоритмы" уж слишком для маслят книга.

    А вот по девопсу я что-то не вижу тут ничего.
    Для девопса важно:
    1. Понимать, как устроен процесс разработки. В идеале ещё и уметь писать код
    2. Уметь работать с ci/cd системами. Gitlab, Azure devops, Jenkins, Teamcity
    3. Уметь работать с git
    4. Уметь работать с линуксовой консолью, и с линуксом в целом
    5. Шарить за docker и k8s
    6. Понимать, что devops - это набор практик, а не должность.
    Ответ написан
    7 комментариев
  • Как вызвать эту функцию?

    @karminski
    Senior React.JS Developer
    ___grecaptcha_cfg.clients['0']['U']['U']['callback']()

    Скобки на конце для вызова функции
    Ответ написан
    2 комментария
  • Стоит ли подписывать такой nda ???

    BasiC2k
    @BasiC2k
    .NET developer (open to job offers)
    В договоре можно указать штраф хоть на миллиард. Но при взыскании этой суммы в судебном порядке (только так, если Вы не согласны) судья попросит обосновать эту сумму, т.е. пояснить - какой ущерб был причинен работодателю. И есть ли причинно-следственная связь между Вашими действиями и последствиями. Также в организации должен быть закреплен приказом перечень сведений, составляющих коммерческую тайну. И, что важно, должны проводиться конкретные мероприятия по защите этой самой тайны. Разумеется со всеми документами Вы должны быть ознакомлены под роспись.

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

    PS Разглашать чужие тайны плохо.
    Ответ написан
    Комментировать
  • Почему функция не видит переменную?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    А кто текст ошибки будет читать?
    Uncaught TypeError: [1,2,3] is not a function

    Лучше всегда использовать точку с запятой, чтоб таких ошибок не было.
    Конкретно тут возникает ситуация, что круглые скобки вокруг функции являются продолжением выражения с массивом, то есть работает это по сути так:
    let map = [1, 2, 3](async () => {
    	console.log(map)
    })()
    Ответ написан
    Комментировать
  • Как защититься от двойного списания в многопоточном приложении?

    @rPman
    Блокировку во время траты уже сказали, но бывает что процесс может длиться достаточно долго, чтобы пользователь в соседнем окошке не смог совершить параллельно оплату (у него будет все висеть), поэтому блокировки реализуют программно

    Добавь к аккаунту пользователя поле lockedBalance, в начале транзакции покупки добавляй к этому значению нужную сумму для траты (а по окончанию эту же вычитай как от сюда так и из общего баланса), соответственно итоговый баланс при проверке считай из разницы основного баланса и этого блокированного. Если транзакция сфейлится, это придется отслеживать, заблокированный баланс так же уменьшай на сумму сделки но не трогай общий.

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

    @Voland69
    Такая Headers?.UserAgent запись - это Null Propagation - если Headers == null выражение вернет null (без ? было бы NRE)
    value ?? string.Empty это сравнение значения с null - если value != null, то вернет value, в противном случае вернет string.Empty
    Ответ написан
    Комментировать
  • ASP.NET и .NET одно и то же?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Библиотека .net - библиотека, пригодная для использования в любых .net-проектах.
    Библиотека asp.net - библиотека, специально для asp.net, в котором свои фичи.
    Но тк сейчас "обычный" aspnet - легаси, то и смысла большого в такой либе нет.
    Ответ написан
    Комментировать
  • Есть ли смысл при подаче резюме?

    @mkone112
    Начинающий питонист.
    Если брать к примеру вакансии "на завод", то там ситуация обратная — позвонил, значит заинтересован. Отравил мусорное резюме, значит не заинтересован.

    Просто отправляй не мусорное резюме. Тогда это уже hr будет думать - звонить тебе или писать.
    Ответ написан
    Комментировать
  • Когда использовать type а когда интерфейс (не включая тех. детали и синтаксис)?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Если вам нужно использовать обьект то интерфейс, если создавать то класс. Это если совсем утрировать.
    Вот хорошая статья
    https://weblogs.asp.net/dwahlin/the-role-of-interf...

    Ну и простое толкование, причем первое более понятное, это точка взаимодействия, договор

    Interface

    a point where two systems, subjects, organizations, etc. meet and interact.
    the interface between accountancy and the law
    2
    COMPUTING
    a device or program enabling a user to communicate with a computer.
    a graphical user interface
    Ответ написан
    Комментировать
  • Как подобрать регулярку для урла?

    Stalker_RED
    @Stalker_RED
    так?
    const links = [
      'mysite.com/param/sometext-alt-text/otherparam/text?zzzz',
      'mysite.com/param/foo/otherparam/qqqqqq',
      'mysite.com/param/123/otherparam/jfghjfghk?...',
      'mysite.com/param/foo/otherparam/gdfsghdfhkj',
      'mysite.com/param1/sometext-alt-text/otherparam/text?zzzz',
      'mysite.com/param2/foo/otherparam/qqqqqq',
      'mysite.com/param/123/otherparam3/jfghjfghk?...',
      'mysite.com/param/foo/otherparam4/gdfsghdfhkj',
    ];
    
    const re = /param\/(?<param>.+)\/otherparam\/(?<otherparam>.*)/;
    links.forEach(link => {
      const found = link.match(re);
      console.log(link, found);
    });


    и регулярки лучше не подбирать а составлять.
    Ответ написан
    1 комментарий
  • Как проверить регистр первой буквы?

    0xD34F
    @0xD34F Куратор тега JavaScript
    str[0] === str[0].toUpperCase()

    или

    /^[A-Z]/.test(str)

    или

    (c => 64 < c && c < 91)(str.charCodeAt(0))

    или

    'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.includes(str.at(0))

    Но что если там вообще не буква?
    Если такое может быть, то...
    ...ни хрена тут больше не скажу, тщательнее надо было вопрос продумывать.
    Ответ написан
    Комментировать
  • Проблема в "нерандомности" рандома или ошибка в реализации?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    В C#, при создании объекта Random без параметра, он инициализируется системным временем, которое имеет конечное разрешение. Если два объекта созданы с одним значением инициализатора, то они будут выдавать одинаковую последовательность.
    В вашем случае надо один раз до цикла создавать объект Random, а в цикле только вызывать его метод Next.
    Ответ написан
    3 комментария