• Как в куче показано или записано, что, например, класс В наследуется от класса А?

    yarosroman
    @yarosroman Куратор тега C#
    C# the best
    Базовый класс можно даже через рефлексию вытащить можно. По нескольким последним вопросам, я думаю, вы не туда копаете, не понимая многих базовых принципов. Рано вам ещё под капот лезть. Ну и у Рихтера вы не найдете ничего про внутренности, не смотря на очень громкое название. Ну если уж и очень охота под капот залезть, поищите Станислава Сидристого книгу, он ее на гитхаб выложил, Саши Гольдштейна, оптимизация .net приложений, есть конференция dotnext, они на канале yt выкладывают записи с выступлений. Но повторюсь вам ещё рано туда залезать, направьте свои силы на изучение базы. Да и чтобы под капот лезть, необходимо, хотя бы минимальное, знание архитектуры ПК, знание ассемблера, устройства памяти, процессов.
    Ответ написан
    7 комментариев
  • Как в куче показано или записано, что, например, класс В наследуется от класса А?

    ayazer
    @ayazer
    Sr. Software Engineer
    So, как в куче помечено, что класс B унаследован от класса А?

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

    вот можно начать отсюда https://docs.microsoft.com/en-us/archive/msdn-maga...

    Почему это происходит?

    потому что-то конструктор класса А может инициализировать поля которые потом нужны конструктору класса B.
    Ответ написан
    4 комментария
  • Как в куче показано или записано, что, например, класс В наследуется от класса А?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    ни как. это записано в тексте программы, а последовательность вызовов строит компилятор
    ps
    если мы в методе Main напишем B b = new B();, то у нас сначала вызовется статический конструктор в классе B, потом статический конструктор в классе A, потом динамический конструктор в классе A, и динамический конструктор класса В.
    а над статикой не заморачивайтесь вообще, пока хорошенько не поймете что это такое. это не очень понятно на начальных этапах изучения, и это точно не надо учитывать, пока не дойдете до необходимости создания собственных переопределений статических конструкторов
    Ответ написан
    2 комментария
  • Зачем нужны статические(ударение на слово "статические") поля/автоматические статические свойства в классе?

    Griboks
    @Griboks Куратор тега C#
    Статические члены относятся к типу класса, а не его экземпляру. Это на один уровень выше в иерархии типов.

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

    Например, мы хотим иметь несколько разных методов вычисления площади класса "гиперсфера" в зависимости от размерности пространства. Классический подход: передавать размерность в конструктор, а в методе GetSquare() каждый раз у каждого объекта проверять размерность и использовать соответствующую формулу. Однако, было бы проще задать размерность сразу для типа "гиперсфера", т. е статически. Тогда и в конструкторе меньше параметров, и каждый раз проверять не требуется, и лишняя память не тратится, и меньше кода писать, и новые объекты сразу создаются с нужной формулой. Иными словами, паттерн "фабрика".
    Ответ написан
    Комментировать
  • Зачем нужны статические(ударение на слово "статические") поля/автоматические статические свойства в классе?

    yarosroman
    @yarosroman Куратор тега C#
    C# the best
    Одна из реализаций паттерна синглтон, на статическом поле класса строится. Ну и как выше, всякие счётчики, какой нибудь класс обработчик, общий на все классы, да куча разных кейсов.
    Ответ написан
    Комментировать
  • Зачем нужны статические(ударение на слово "статические") поля/автоматические статические свойства в классе?

    @majstar_Zubr
    C++, C#, gamedev
    Статическая область памяти инициализируется до начала исполнения точки входа main.

    Статический класс гарантирует существование единственного экземпляра класса.

    Статическое поле позволяет реализовать хранение данных, которые будут существовать вплоть до выхода из функции main.

    Статический конструктор позволяет произвести предварительную инициализацию для класса ещё до создания хотя бы одного экземпляра класса.

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

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

    Если использование кода не предполагает использование класса в нескольких потоках, то допускается использование "общих" данных в статических полях, но как правило, это рационально только для readonly и const.
    Ответ написан
    Комментировать
  • C# Что происходит, когда мы передали делегат в метод и добавили ему там 2 метода?

    yarosroman
    @yarosroman Куратор тега C#
    C# the best
    Я вам вчера писал в вашем вопросе про строки писал, так вот тут аналогично проходит. Перед вызовом функции ваша ссылка на делегат дублируется на стеке. Так как делегаты иммутабельны, при каждом добавлении метода к делегату, будет создаваться новый делегат и ссылочка будет в невидимую вами копию писаться, не трогая переменную. Это защита от непредвиденного поведения. Такое же поведение как и со строками. Хотите волшебство, передайте параметр через ref.

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

    yarosroman
    @yarosroman Куратор тега C#
    C# the best
    https://youtu.be/KbuJdkPLAjw посмотрите это, многое на место встанет.

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

    mayton2019
    @mayton2019
    Bigdata Engineer
    Несколько мыслей.

    1) Существуют языки программирования в которых рекурсия вообще заменяет цикл (Haskell, Erlang) и другого способа описать итерацию кроме как через рекурсивную функцию - нету. Но наверное в топике тема рекурсии - не основная - а просто частный пример.

    2) Во всех случаях всегда надо выбирать "читабельность". Прошли времена когда программисты отдавали дань ассемблеру или указателям на сырую память. Сегодня так пишут все меньше и меньше. И основная задача написания кода - сделать его понятным для вашего коллеги. Цитата : "Код пишется человеком для прочтения человека и лишь в очень редких случаях - для машины".

    Вобщем пишите код. Просите коллег чтоб они его посмотрели и ПОНЯЛИ что вы имели в виду. И если коллеги будут кричать WTF! - фиксируйте их замечания и доводите до такого состояния чтобы ни у кого не было вопросов.
    Это будет идеальный код по Роберту Мартину.
    Ответ написан
    Комментировать
  • Что происходит, когда мы передаём string в метод и обрабатываем его значение там, учитывая, что string - ссылочный и неизменный тип?

    freeExec
    @freeExec
    Участник OpenStreetMap
    String хитрый тип, до недавнего времени его нельзя была задать в роли константы, т.к. он действительно ссылочный тип. Ещё по-умолчанию он интернированный, т.е все одинаковые тексты ссылаются на одним объект. Текст нельзя поменять, можно только создать новый объект с новым текстом.
    У вас же передаётся ссылка на объект "str", а затем в методе создаётся новый объект текста и ссылка сохраняется в переменную.
    Отсюда следует, что если вы собираете условный json постоянными склейками текстов, то вы генерируете кучу новых объектов - не эффективно расходуя память. Для это лучше использовать StringBuilder, который весь текст складывает в один буфер с заранее большей длинной.
    Ответ написан
    5 комментариев
  • Как запустить программу на W8 с W10?

    GavriKos
    @GavriKos
    Не запускается с какими словами? Какие ошибки?
    Собрали релиз или дебаг? Под какой .NET? На win8 какой .NET?
    Ответ написан
    4 комментария
  • Как генерируется hashcode по умолчанию, то есть в классе object, в C#?

    Griboks
    @Griboks Куратор тега C#
    Хотелось бы добавить, что стандартная реализация не стандартизирована и не рекомендуется к явному использованию.
    Furthermore, .NET does not guarantee the default implementation of the GetHashCode method, and the value this method returns may differ between .NET implementations, such as different versions of .NET Framework and .NET Core, and platforms, such as 32-bit and 64-bit platforms. For these reasons, do not use the default implementation of this method as a unique object identifier for hashing purposes.
    Ответ написан
    1 комментарий
  • Как генерируется hashcode по умолчанию, то есть в классе object, в C#?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    /// <summary>Служит хэш-функцией по умолчанию.</summary>
        /// <returns>Хэш-код для текущего объекта.</returns>
        [__DynamicallyInvokable]
        public virtual int GetHashCode()
        {
          return RuntimeHelpers.GetHashCode(this);
        }

    https://stackoverflow.com/questions/720177/default...

    Она же вызывает вот этот нативный код.

    FCIMPL1(INT32, ObjectNative::GetHashCode, Object* obj) {  
        CONTRACTL  
        {  
            THROWS;  
            DISABLED(GC_NOTRIGGER);  
            INJECT_FAULT(FCThrow(kOutOfMemoryException););  
            MODE_COOPERATIVE;  
            SO_TOLERANT;  
        }  
        CONTRACTL_END;  
    
        VALIDATEOBJECTREF(obj);  
    
        DWORD idx = 0;  
    
        if (obj == 0)  
            return 0;  
    
        OBJECTREF objRef(obj);  
    
        HELPER_METHOD_FRAME_BEGIN_RET_1(objRef);        // Set up a frame  
    
        idx = GetHashCodeEx(OBJECTREFToObject(objRef));  
    
        HELPER_METHOD_FRAME_END();  
    
        return idx;  
    }  
    FCIMPLEND


    Еще посмотрите эту статью.
    see Knuth Vol 2 p16 (3.2.1.2 Theorem A)

    https://habr.com/ru/post/188038/

    https://codingsight.com/the-origin-of-gethashcode-...
    Ответ написан
    Комментировать
  • Читабельность кода или скорость его выполнения?

    tzlom
    @tzlom
    Читабельность тоже не простой вопрос, я встречал людей для которых рекурсия менее читабельна чем цикл. Но читабельность это главное, суть в чём - код все равно когда-то придется менять (например он работает слишком медленно), если он не читабельный - его проще выкинуть, а это и потраченные ресурсы и риск.
    Ответ написан
    2 комментария
  • Смысл и предназначение обычного бинарного дерева? Какова погрешность измерение времени программы при помощи Stopwatch'ера?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Просто бинарное дерево ради бинарного дерева особо нигде не используется. Это просто вид организации данных. Можно их линейно в список или массив сложить, можно организовать в виде дерева. Но на нем можно делать разные крутые штуки, навешивая что-то сверху. Обычно получается делать всякие полезные вещи с логарифмической сложностью - потому что дерево, если его удачно организовать имеет логарифмическую высоту.

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

    Про stopwatch ничего не знаю, что это такое даже.

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

    zagayevskiy
    @zagayevskiy
    Android developer at Yandex
    Бинарные деревья это обычно деревья поиска. Просто бинарные деревья, по-моему, не используются. Единственное, что на ум приходит, это hash tree(Merkle tree) в криптографии. В общем, правила будут такие, какие задашь в имплементации.
    Вопросы, ну например, что такое высота дерева? (Здесь и далее за дерево считай BST). Каково асимптотическое поведение основных операций над деревом? Как их улучшить? Что такое сбалансированное дерево? Какие реализации сбалансированных деревьев поиска ты знаешь? Какие из них используются в стандартной библиотеке твоего основного языка?
    Можно придумать пачку вопросов про обход: как обойти дерево по слоям(в ширину)? В глубину? Как проверить, что бинарное дерево является деревом поиска?
    Ну и потом можно спросить, какие небинарные деревья ты знаешь?
    Ответ написан
    Комментировать
  • Зачем нужно знать эффективность\сложность алгоритма?

    mayton2019
    @mayton2019
    Bigdata Engineer
    На алгоритмической сложности стоит вся современная криптография (https-соединения в браузере) и криптовалюты. Все они сегодня работают и существуют только потому что есть алгоритмы которые работают в одну сторону легко и быстро (нанесение электронной цифровой подписи) а в обратку - настолько туго и бесконечног долго что сама по себе генерация лже-подписи становится невыгодной злоумышленнику просто по временнЫм затратам.

    А если говорить простыми словами то все подмножество алгоритмов делится на константные O(1) - это поиск в хеш-табличке. Логарифмические O(Log n) - это поиск в дереве или сортированной коллекции. Линейные - любой поиск в произвольнйо коллекции O(n). И дальше идут полиномиальные (это всегда цикл в цикле) экспоненциальные O(exp n). Здесь начинается криптография. И комбинаторные, в формулу которых входит факториал от N или еще апроксимируется O(n^n). Последние как-раз и создают тот самый класс нерешаемых наукой алгоритмов для которых пытаются строить квантовые устройства работающие совсем на других физических принципах.
    Ответ написан
    Комментировать
  • Зачем нужно знать эффективность\сложность алгоритма?

    Griboks
    @Griboks Куратор тега C#
    Если кратко: для вас смысла учить нет.

    Если подробно...

    1. Сложность/эффективность бывает разной. Обычно понимается как время выполнения или количество операций. Но также бывают и другие эффективности/сложности, например эффективность использования памяти.
    2. Знание всей этой математики не даёт абсолютно никакой пользы при написании кода. Требуется оно только в двух случаях:
    а) при проектировании (программным архитекторам) и только при условии жёстких ограничений (обычно слабого железа)
    б) при оптимизации, когда вы просматриваете результат профилирования и видите узкое место в каком-то конкретном алгоритме
    Ответ написан
    Комментировать
  • Читабельность кода или скорость его выполнения?

    Ni55aN
    @Ni55aN
    Конечно же чистота кода. В 99% процентах случаев не важно, выполняется ваша функция за O(n3) или O(log n). Про низкоуровневые оптимизации вообще стоит забыть, если изначально не стоит требования писать под "калькуляторы".
    Наверное одно из немногих, о чем не стоит забывать, это применение правильных структур данных, чтобы не получилось так, что на каждый чих будет там что-то пересчитываться, когда этого можно избежать
    Ответ написан
    Комментировать
  • Читабельность кода или скорость его выполнения?

    tomnolane
    @tomnolane
    профессиональный разработчик
    DRY, KISS ваше все.
    Остальное придет с опытом, особенно когда будете работать в команде
    Ответ написан
    Комментировать