Задать вопрос
  • Когда целесообразно использовать params?

    params - Это сахар для передачи одномерного массива.
    Целесообразно его использовать там, где на этапе написания кода эти значения и указываются, вместо передачи произвольного массива.

    Например в string.Format и других подобных методах (ILogger, параметры для SQL-запросов, параметры для HTTP-запросов)
    Оба примера валидны и в принципе делают ровно одно и то же, но с params выглядит и читается приятнее/проще:
    string.Format("{0}, {1}", 1, 2);
    string.Format("{0}, {1}", new object[] {1,2});

    Другой пример из практики дать не могу, тк не помню, но такие есть.
    Ответ написан
    Комментировать
  • Когда лучше использовать сортировку пузырьком, шейкерную сортировку, сортировку Шелла, сортировку выбором, а когда алгоритм быстрой сортировки?

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

    Гуглишь название каждого алгоритма, и будет тебе подробнейшее описание.
    Ещё можешь почитать книгу "Алгоритмы, их построение и анализ".

    Или лучше стоит всегда использовать быструю сортировку?

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

    Какие методы сортировки вы можете посоветовать и каким/какими пользуетесь сами?

    Стандартным Array.Sort()/ List.Sort() / OrderBy

    Необходимость выбора более эффективного алгоритма возникает на очень больших данных, когда счёт идёт на гигабайты, а то и терабайты, но там уже и смотрят на типичный порядок, в котором расположены данные, и прочее.
    Ответ написан
    Комментировать
  • Как преобразовать целое число в дату (DateTime) и наоборот? А также в чём отличия DateTime и Stopwatch, кроме точности расчёта?

    все преимущества и недостатки DateTime и Stopwatch.

    Звучит как "все преимущества и недостатки автомобиля и электрочайника"

    Судя по тому что вы их сравниваете - видимо вы хотите измерить длительность какой-то операции.

    Если нужно точно измерить короткий промежуток времени, то лучше использовать Stopwatch, тк он использует HPET

    Если нужно приблизительно (с точностью до мс) померить разницу во времени между двумя событиями, например пользователю отобразить что-то типа "сообщение отправлено 5 минут назад" - лучше использовать DateTime, а лучше даже DateTimeOffset.

    Если вы хотите оценить производительность кода, то лучше использовать BenchmarkDotNet.

    Вот, например, у меня есть целое число 9847748582984. Как его конвертировать в дату?

    Для начала стоило бы узнать, что это число означает, но методом тыка определяем, что это ...
    А нифига не определяем. Ни один из способов инициализации времени не даёт ничего адекватного.
    var dt1 = new DateTime(9847748582984).Dump("dt1"); // 12.01.0001 09:32:54
    var dt2 = DateTime.FromBinary(9847748582984).Dump("dt2"); // 12.01.0001 09:32:54
    var dt3 = DateTime.FromFileTime(9847748582984).Dump("dt3"); // 12.01.1601 14:32:54
    //var dt4 = DateTime.FromOADate(9847748582984).Dump("dt4"); // Invalid
    //var dt5 = DateTimeOffset.FromUnixTimeSeconds(9847748582984).Dump("dt5"); // Out of range
    var dt6 = DateTimeOffset.FromUnixTimeMilliseconds(9847748582984).Dump("dt6"); //23.01.2282 13:43:02 +00:00

    Если кто знает ещё форматы времени - дополняйте

    PS: https://habr.com/ru/post/226279/
    Ответ написан
    1 комментарий
  • Как сделать POST запрос, имею на руках данную инфу(см. ниже)?

    E1ON
    @E1ON Куратор тега JavaScript
    Programming, Gamedev, VR
    await fetch('https://api.instagram.com/oauth/access_token', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/x-www-form-urlencoded',
        },
        body: `client_id=app-id&client_secret=app-secret&grant_type=authorization_code&redirect_uri=redirect-uri&code=code`
      });
    Ответ написан
    2 комментария
  • Как запретить пользователю переход по url-адресу, написанному от руки в поисковой строке браузера?

    Privetiq
    @Privetiq
    Тестирую всегда на проде
    Сложно подсказать не видя кода, но смею предположить что на сайте хэдер - отдельный файл, подключаемый к любой странице. В таком случае, вам стоит прописать Простенькую проверку на авторизацию (тоже не понятно каким из способов она у вас сделана, но рискну предположить что у пользователя добавляется кука после авторизации). И тогда ваш код будет выглядеть примерно так:
    Если пользователь находится не на %хостнейм% проверяем куку(авторизацию). Если нет - redirect 301 на главную, и всё. Можно написать и на php и на js решение в 4 строчки.
    Пишите код по выше (в head например).
    Ответ написан
    Комментировать
  • Как убрать эту(смотрите скрины) полосу, находящуюся снизу фона?

    @bossigorxxx
    Так попробуй:
    <!DOCTYPE html>
    <html>
    <head>
        <meta name="viewport" content="width=device-width" />
        <title>Inst-Post Searcher</title>
        <style>
            body {
                background: #2a2929;
                background: -moz-linear-gradient(to bottom, #333 20%, #2a2929 90%, #808080);
                background: -webkit-gradient(linear, 0 0, 0 100%, from(#333), to(#808080), color-stop(0.5, #2a2929));
                filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333', endColorstr='#808080');
                background-size: 100% 106%;
            }
            html, body{
                height: 100%;
            }
    
            .new {
                color: darkorange;
                text-decoration: none;
                top: 25px;
            }
        </style>
    </head>
    <body>
        <div style="text-align: center;">
            <nobr><h1 style="color: darkorange;">Inst-Post Searcher</h1></nobr>
            <hr size="2" color="darkorange" />
        </div>
        <form method="post">
            <div style="left: 32.5%; text-align: center; font-size: 1.0vw; color: darkorange; background: none; border: none;">
                <hr style="position: absolute; top: 90%; width: 99%" size="5" color="#000000" />
                <nobr><a style="position: absolute; top: 95%; left: 33%" class="new" href='@Url.Page("/TermsOfUse")'>Условия использования</a></nobr>
                <nobr><a style="position: absolute; top: 95%; left: 43.5%" class="new" href='@Url.Page("/PrivacyPolicy")'>Политика конфиденциальности</a></nobr>
                <nobr><a style="position: absolute; top: 95%; left: 57.5%" class="new" href='@Url.Page("/DeveloperContacts")'>Контакты разработчика</a></nobr>
            </div>
        </form>
        @RenderBody()
    </body>
    </html>
    Ответ написан
    5 комментариев
  • Как сделать переход от одной страницы Razor к другой с помощью кнопки, которая находится на первой странице?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Селект
    <form class="is-small select" id="FilterForm" method="post" asp-page-handler="FilterGenerated">
                    <select asp-for="SelectedOptions" asp-items="@Model.Options" onchange="this.form.submit()"></select>
                </form>


    ссылка
    <a asp-page="Edit" asp-route-id="@item.Id">Изменить</a>
    Ответ написан
  • Почему данный html-код не выводит картинку кнопки на веб-сайт?

    web_Developer_Victor
    @web_Developer_Victor
    Что такое google?
    1. Не лучше сделать??
    <button type="submit">
        <img src="..." alt="...">
    </button>


    2. Уберите пробел после "src="
    3. А так все должно работать. Наверно, кнопка куда-то уезжает через style="position:relative; top: 450px;"
    Ответ написан
    7 комментариев
  • Какой вы посоветуете использовать шаблон Visual Studio'и при создании веб-приложении в ДАННОЙ ситуации?

    @Qualiant
    Недостаточно информации. Что вы собираетесь делать с апишкой? Куда выводить? Есть ли UI?
    Ответ написан
    7 комментариев
  • Нужно ли самостоятельно реализовывать механизм "Mark and Sweep" или он уже есть в сборщике мусора?

    ayazer
    @ayazer
    Sr. Software Engineer
    Не надо ничего самому писать, все уже есть с коробки.
    Ответ написан
    Комментировать
  • Как компилятор понимает, что первую функцию, которую нужно вызвать, будет именно Main()?

    Casper-SC
    @Casper-SC
    Программист (.NET)
    В книге CLR via C# - Программирование на платформе Microsoft.NET Framework 4.5 на языке C#. 4-е издание на странице 37 в главе Исполнение кода сборки написано:
    Далее основной поток вызывает определенный в библиотеке MSCorEE.dll метод, который инициализирует CLR, загружает сборку EXE, а затем вызывает ее метод Main, в котором содержится точка входа. На этом процедура запуска управляемого приложения считается завершенной.


    Так же написано в документации Microsoft, что вызывается именно метод Main, если в качестве параметра компилятора -main не передать название другого метода.

    Документация Microsoft:
    Main() и аргументы командной строки
    Запуск приложения
    Ответ написан
    22 комментария
  • Зачем нужен binder или объект связывателя в общем?

    freeExec
    @freeExec
    Участник OpenStreetMap
    Нет.
    Ответ написан
    Комментировать
  • Статический класс - это объект-тип?

    @Kaktys_DH
    Если ты не создал объект, то это тип
    Ответ написан
    8 комментариев
  • Где находится статический класс в памяти?

    Вспомнил, что читал про такое в книге "Оптимизация приложений на платформе .Net".


    Таблица методов
    Поле указателя на таблицу методов ссылается на внутреннюю структуру CLR под названием таблица методов (method table), которая в свою очередь ссылается на другую внутреннюю структуру под названием EEClass (где ЕЕ, это аббревиатура от Execution Engine - механизм выполнения). Вместе, таблица методов и EEClass, содержат информацию, необходимую для выбора виртуального метода, метода интерфейса, статической переменной, определения типа объекта во время выполнения, доступа к методам базового класса и многих других целей. Таблица методов содержит часто используемую информацию, требуемую для выполнения операций такими механизмами, как механизм выбора виртуального метода, а структура EEClass содержит информацию, используемую реже, например, механизмом рефлексии. Ознакомиться с содержимым обеих структур данных можно с помощью команд !DumpMT и !DumpClass библиотеки SOS.

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


    Есть таблицы, где вся информация хранится.
    В windbg можно посмотреть подробней.

    Пример класса:
    class MyClass
    {
        private string _field1 = "Some string 1";
        public string Field2 { get; set; }
    }
    
    0:003> !do 0000005400006600
    Name:        ConsoleApplication1.MyClass
    MethodTable: 00007ffa2b5c4378
    EEClass:     00007ffa2b6d2548
    Size:        32(0x20) bytes
    File:        E:\...\ConsoleApplication1.exe
    Fields:
                  MT    Field   Offset                 Type VT     Attr            Value Name
    00007ffa89d60e08  4000002        8        System.String  0 instance 0000005400006620 _field1
    00007ffa89d60e08  4000003       10        System.String  0 instance 00000054000035a0 <Field2>k__BackingField


    Если интересно ставьте SOS и играйтесь.
    Я это уже делал, и выкладывал результаты в https://habr.com/ru/post/260047/
    Заминусили, многого не знал тогда. Но это уже история.
    Ответ написан
    2 комментария
  • Где находится статический класс в памяти?

    ayazer
    @ayazer
    Sr. Software Engineer
    , но таблицы методов создаются под каждый объект класса индивидуально.

    нет, вы что-то путаете. 1 таблица на каждый тип, нет смысла создавать копию под каждый объект. ну и теперь ответ на остальную часть вопроса становится очевиден - нет разницы между таблицей методов для статического/не статического класса - все лежит где-то в куче в AppDomain.

    upd:
    В какой памяти находится статический класс, в куче, по идее?
    конечно, только не в той которая SOH/LOH, а в той что упоминается у рихтера как "на самом деле куч больше чем 2, но остальное вам не нужно". А если еще точнее - в high frequency heap. Не знаю зачем это знание вам надо, но живите теперь с этим.

    Статический класс - это объект-тип, который содержит таблицу методов, но только статических и статического конструктора?

    мех, на самом деле так себе формулировка. лучше остановится на том, что в контексте c# - статический объект это специальный случай объекта, который может содержать только статические поля/методы.
    Ответ написан
    1 комментарий
  • Как происходит вызов сокрытого метода под капотом?

    ayazer
    @ayazer
    Sr. Software Engineer
    а в книгах этого и не должно быть. вы сейчас спрашиваете про детали реализации, которые даже рамках .нета могут отличатся (.нет это же не только c#). Обычно за такими знаниями нужно лезть конкретно в кишки компилятора/рантайма. Но помните что знание нескольких принципов заменяет знание многих нюансов, и обычно понимания "как оно обычно устроено" хватает с головой.

    и отвечая конкретно на этот вопрос - какой именно метод вызывать определяется в рантайме на основе информации в виртуальной таблице которая сотв. классу. И у рихтера точно есть упоминание об этом (что вызов виртуального метода несколько медленей т.к. приходится делать дополнительную проверку по виртуальной таблице чтоб понять что именно нужно вызывать).

    В целом это происходит +- так:
    1. для каждого класса создается виртуальная таблица а-ля [method_id address ...]

    Class1:
    0x001 0x0001 ...
    0x002 0x0100 ...
    ...

    Class2:
    0x002 0x0F00 ...
    ...

    2. когда вы делаете instanceOfMyClass.DoSomethingUsefull(...) CLR проверяет виртуальный таблицы (возможно пробегается по всей иерархии наследования, чтоб понять где точно лежит нужный метод) и дальше вызывает его передав в него адресс где в памяти лежит сам класс И список параметров с которыми вызывается метод.

    ^ могу ошибатся в нюансах, но принцип такой
    Ответ написан
    Комментировать
  • Что происходит под капотом, когда мы скрываем метод производного класса?

    freeExec
    @freeExec
    Участник OpenStreetMap
    Вот вы уже две недели спрашиваете про всяких "подкапот" который в повседневной жизни никому не сдался.
    Сколько собственных программ вы уже написали? Сколько пришлось переписать из-за вновь полученных знаний? Каков выигрышь? Когда начнёте сами добывать информацию? Сложно скомпилировать код и посмотреть как он там "под капотом"?
    IL_0000: nop
    IL_0001: newobj instance void B::.ctor()
    IL_0006: stloc.0
    IL_0007: ldloc.0
    IL_0008: callvirt instance void A::DoSmth()
    IL_000d: nop
    Ответ написан
    5 комментариев
  • Куда записываются данные о том, что такая-то переменная является константой?

    ayazer
    @ayazer
    Sr. Software Engineer
    вы же уже спрашивали: Где в экземпляре примитивного ссылочного типа, например string, находится информация о том, что этот экземпляр — константа?

    когда код уже скомпилирован - это нигде не хранится т.к. у нас записаны просто значения.
    во время компиляции - оно хранится вот так https://github.com/dotnet/roslyn/blob/7a836c8e5a06...

    например для const decimal во время компиляции будет использоватся вот это https://github.com/dotnet/roslyn/blob/7a836c8e5a06...

    Но опять таки - это нужно только компилятору чтоб знать что с этими значениями делать. В результате значения констант будут подставлены по всем местам использования (о чем вы можете легко убедится декомпилировав код)
    Ответ написан