• Зачем оператор new в C#?

    @basrach
    tex0, new в C# может быть одним из 3-ех:
    Либо оператором: https://docs.microsoft.com/en-us/dotnet/csharp/lan...
    Либо модификатором объявления метода: https://docs.microsoft.com/en-us/dotnet/csharp/lan...
    Либо ограничением generic параметра: https://docs.microsoft.com/en-us/dotnet/csharp/lan...
  • Зачем оператор new в C#?

    @basrach
    freeExec,
    статический конструктор объекта
    это не совсем правильная по смыслу фраза. Либо просто "статический конструктор" - что правильно, либо по смыслу еще "конструктор типа (класса)". Статический конструктор вызывается в момент когда runtime создает в памяти тип (или класс) (не объект, т.е. не экземпляр типа, а сам тип) для определенного Domain. Тип всегда существует в единственном экземпляре, поэтому и конструктор статический вызывается строго один раз. Типы инициализируются в памяти по мере надобности, поэтому и статический конструктор вызывается во факту при первом обращении к типу, либо для создания экземпляра этого типа, либо для вызова метода, либо для получения его метаданных и т.д.
  • Использование Nhibernate и Entity framework в одном проекте?

    @basrach
    aamaster, я думаю уважаемый shai_hulud хотел сказать, что две различные технологии в проекте решающие одну и ту же задачу, это не только создаёт некоторый хаос, но и практически удваивает объем работ в случае изменений, так как изменять придется в двух местах и по разному. В таком случае действительно проще и выгоднее за один раз полностью перевести проект на новую технологию, если её очень хочется.
  • Возможно с помощью Entity Framework вставить каскадно данные?

    @basrach
    one__for__one, приведенного кода недостаточно для того чтобы найти ошибку. Но, если это ошибка компиляции, а не выполнения, то дело не в EF. Судя по тексту, в какой-то метод передаётся объект типа Predok, а там ожидается тип Naslednik.
  • Как контролировать память кортежей?

    @basrach
    Griboks, а покажите код с ref, который работает, и GC.Collect(), который не работает, пожалуйста
  • Как контролировать память кортежей?

    @basrach
    Griboks, ref это способ передачи аргумента, по ссылке в данном случае, иначе по значению. На сборку мусора это никак не может повлиять.
  • Как контролировать память кортежей?

    @basrach
    Griboks, я сразу не заметил, а видимо проблема в этом: new byte[12345678] - объекты больше 85 кб попадают в так называемый LOH. Этот LOH GC будет освобождать только в крайнем случае. Это не совсем утечка, так как GC знает о таких объектах. Но потребляемая память может расти, да.
    https://docs.microsoft.com/en-us/dotnet/standard/g...
  • Как контролировать память кортежей?

    @basrach
    Griboks, нет.
    А попробуйте освободить память вот так:
    GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
    GC.Collect();
  • Вопросы по Clean Architecture?

    @basrach
    Про Id тоже неверно. Id может и должно активно использоваться в моделях. Например в таком кейсе. Нужно назначить задачу исполнителю. Допустим существует абстрактный интерфейс пользователя, и там есть список задач и список исполнителей. Пользователь выбирает исполнителя и задачу и нажимает кнопку "Назначить задачу Исполнителю".

    Теперь подумаем что нужно, чтобы выполнить эту операцию. Первое что приходит на ум это создать коллекцию Tasks у исполнителя и добавить в эту коллекцию выбранный Task. Конкретно в данном кейсе вроде бы подвоха нет. Но если посмотреть с другой стороны, когда нужно загрузить Исполнителя из базы данных. Так как у него есть коллекция Tasks, нужно загружать целиком и её, а у каждого Task-а есть тоже свои коллекции и т.д. И таких уровней может быть достаточно много. А могут быть еще и циклические ссылки.
    И теперь сам вопрос, нужно ли тянуть в память половину БД чтобы назначить задачу исполнителю? Ответом на этот вопрос как раз и является использование Id вместо сущностей. Т.е. исполнитель может иметь свойство List Tasks, в котором будут только Id задач, а не сами задачи. При назначении задачи исполнителю в эту коллекцию будет добавляться лишь Id задачи. Таким образом развязывается сложный граф зависящих друг о друга объектов. И не возникает проблемы, когда приходится загружать в память половину БД.
  • Вопросы по Clean Architecture?

    @basrach
    Также хотелось бы заметить, что сущности могут быть моделями ORM. Главный посыл Clean, Hexagonical, Onion -Архитектур - изоляция логики предметной области. Т.е. вы можете делать что хотите, только чтобы Domain не зависел ни от чего, ни от ORM, ни от чего-либо еще. Или выражаясь проще, вы сначала пишете логику в Domain, пишете нужные вам интерфейсы для получения данных I***Repositry. После реализации доменной логики и определения внешних интерфейсов (доступ к БД в данной архитектуре это внешний интерфейс) создаются реализации этих интерфейсов, в том числе интерфейсов репозиториев. А как именно они будут реализованы не так важно. Если ORM и БД позволяет замапить напрямую сущности на таблицы, то стоит этим воспользоваться, т.к. это значительно сократит объем кода, который нужно будет написать вручную, а соответственно и количество ошибок.
  • Вопросы по Clean Architecture?

    @basrach
    То, что вы описываете, чем-то похоже на паттерн Спецификация.
  • Почему в ответе получается 0?

    @basrach
    Юрий, не понимаете потому что считаете что j и 0 это одно и тоже. Это не так.
    На самом деле каждая переменная и каждое значение - это разные ячейки памяти, т.е. j, i, 10, 0 - всё что вы объявили в программе - это всё разные ячейки памяти. Процессор же не умеет работать с ячейками памятью напрямую. Т.е. он не может взять и прибавить к 10 еще 1 прямо в ячейке памяти. Он сначала загружает значение из одной ячейки памяти в свое временное хранилище (регистр), затем другое значение из другой ячейки памяти в другое хранилище (второй регистр) и складывает эти два значения из временных хранилищ (регистров), получает результат 11 в каком-то из регистров, и затем этот результат из регистра записывает в какую-то ячейку в памяти. Или не записывает как в вашем случае. Т.е. когда вы пишете j = 0 происходит следующее: в памяти резервируются две ячейки. В первой нет ничего, в другой значение 0. Процессор загружает значение 0 из второй ячейки памяти в свой регистр, а затем записывает это значение в первую ячейку, которой вы дали имя j, из своего регистра. Тут важно понять, что j = 0 это не математическое допущение аля "пусть j у нас будет 0", это операция, которую выполняет процессор. И чтобы в j поместить 0, надо 0 откуда-то взять и затем положить куда-то.
    Теперь давайте разберем что происходит когда выполняется код j = j++
    Сначала процессор загружает значение j из памяти (это значение равно 0 потому что выше написано j = 0) в свой регистр, затем он производит операцию записи данных из этого регистра в ячейку j, т.е. записывает туда 0, который загрузил в регистр на прошлом шаге. И затем выполняет операцию увеличения значения в своем регистре (а иначе он не умеет, только в регистре), на единицу. И никуда этот результат не записывает.
    Или, если кратко, то j = j++ говорит процессору: возьми значение из j (! фактически делает копию), положи его в обратно j и потом свою копию (а не то что в j) увеличь на единицу. А результат фактически отбрасывается.
    Запись же, как предлагали выше j = ++j говорит процессору: возьми значение из j, увеличь на единицу и результат положи в j.
  • Как сделать выполнение функции после отсчета таймера одной секунды (не Thread.Sleep(1000)) в c#?

    @basrach
    что за реплики дегрдантские? вы инженеры, а выражаетесь как гопники. Поудаляйте свои коменты. Читать даже стыдно такое.