На этапе компиляции
Хорошо, но как это происходит? Как я понял у компилятора есть весь мой и если очень упростить, то он просто знает какие вызовы были. Условно говоря он выделяет память и создаёт ссылку для каждого нового свойства(уникального типа) который как ему известно вызывается в программе?
Сколько было в программе различных дженерик вариантов класса столько типов и будет создано на этапе компиляции
Все понял спасибо
https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/generics-in-the-run-time Вот тут можно подробно почитать. Во время компиляции создаётся просто шаблон метода, в рантайме на его основе генерируется методы под конкретные типы.
Что значит "низкоуровневый C#"? Это ты так IL код назвал(
В jit time
Нет. Для ссылочных типов нужен только один. Размер для них всех одинаковый
вспомнил вопрос на собесе "когда будет создан статический объект"
При первом доступе к ниму
Если б всё было так просто.
нам, джунам, достаточно
А что еще есть?
Статическая переменная инициализируется в определённый, зависящий от рантайма, момент, до первого обращения к ней.
Ну а нахуя его вычислять, если к нему не обращаются?
Незачем, я тебя не правильно понял?
Ну как сказать.
Зачем инициализровать статическое поле до первого обращения к нему?
Чтобы это обращение вернуло правильный результат.
Так можно же во время первого
В Джаве вроде когда класс загружается. Там классы грузятся по необходимости. Может в Шарпе так же.
Ну, там не бывает «во время». Если ты написал var x = A.StaticField, то на самом деле там будет что-то вроде A.CallStaticCtorIfRequired(); var x = A.StaticField; Так вот и получается, что до первого обращения. Часто это примерно то же, что «в момент первого обращения», если угодно.
А callstaticctor всегда будет?
В байткоде его нет, эта проверка эмитится в JIT time. И её может не быть, если JIT уверен, что класс инициализирован.
Кстати, это один из факторов, за счёт которых tiered jit получает преимущество. Чаще всего статические конструкторы во всём коде, который доживает до tier 1, уже вызваны, и эти проверки можно вырезать, тем самым чуть уменьшив и оптимизировав код.
Нет. Слр тебе гарантирует что объект будет создан, а когда -- зависит.
Обсуждают сегодня