170 похожих чатов

Как это работает. В низкоуровневом C# никаких статических свойств с разными

типами нет, только T Value.
В какой момент создается второе статическое поле со вторым типом на этапе компиляции или динамически на этапе выполнения?

30 ответов

18 просмотров

На этапе компиляции

Brykez7- Автор вопроса
Magomed Mirzaev
На этапе компиляции

Хорошо, но как это происходит? Как я понял у компилятора есть весь мой и если очень упростить, то он просто знает какие вызовы были. Условно говоря он выделяет память и создаёт ссылку для каждого нового свойства(уникального типа) который как ему известно вызывается в программе?

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

Brykez7
Хорошо, но как это происходит? Как я понял у комп...

https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/generics-in-the-run-time Вот тут можно подробно почитать. Во время компиляции создаётся просто шаблон метода, в рантайме на его основе генерируется методы под конкретные типы.

Что значит "низкоуровневый C#"? Это ты так IL код назвал(

В jit time

Magomed Mirzaev
Сколько было в программе различных дженерик вариан...

Нет. Для ссылочных типов нужен только один. Размер для них всех одинаковый

Phantom
В jit time

вспомнил вопрос на собесе "когда будет создан статический объект"

Phantom
При первом доступе к ниму

Если б всё было так просто.

Phantom
А что еще есть?

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

Phantom
А нахуя?

Ну а нахуя его вычислять, если к нему не обращаются?

Dr. Friedrich von Never
Ну как сказать.

Зачем инициализровать статическое поле до первого обращения к нему?

Phantom
Зачем инициализровать статическое поле до первого ...

Чтобы это обращение вернуло правильный результат.

Dr. Friedrich von Never
Статическая переменная инициализируется в определё...

В Джаве вроде когда класс загружается. Там классы грузятся по необходимости. Может в Шарпе так же.

Phantom
Так можно же во время первого

Ну, там не бывает «во время». Если ты написал var x = A.StaticField, то на самом деле там будет что-то вроде A.CallStaticCtorIfRequired(); var x = A.StaticField; Так вот и получается, что до первого обращения. Часто это примерно то же, что «в момент первого обращения», если угодно.

Phantom
А callstaticctor всегда будет?

В байткоде его нет, эта проверка эмитится в JIT time. И её может не быть, если JIT уверен, что класс инициализирован.

Dr. Friedrich von Never
В байткоде его нет, эта проверка эмитится в JIT ti...

Кстати, это один из факторов, за счёт которых tiered jit получает преимущество. Чаще всего статические конструкторы во всём коде, который доживает до tier 1, уже вызваны, и эти проверки можно вырезать, тем самым чуть уменьшив и оптимизировав код.

Phantom
При первом доступе к ниму

Нет. Слр тебе гарантирует что объект будет создан, а когда -- зависит.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта