Вопрос: как CLR реализует статические поля в универсальных типах? Где они хранятся и насколько эффективен доступ к ним?
Причина, по которой этот вопрос мне интересен, заключается в том, что программа может создавать сколь угодно много новых типов во время выполнения - типов, которые не были упомянуты во время компиляции.
Итак, среда выполнения должна куда-то закрепить статику. Должно быть, концептуально существует карта каждого типа с его статикой. Самый простой способ реализовать это может заключаться в том, чтобы класс System.Type содержал скрытое поле Object _myStatics. Тогда среде выполнения потребуется выполнить только одно разыменование указателя, чтобы перейти от типа к его статике, хотя ей все равно придется позаботиться о потокобезопасной ровно однократной инициализации.
В любом случае, для любого, кто работает над CLR или знает, как все работает под капотом, это звучит правильно?
Я собираюсь добавить две программы ниже, чтобы попытаться объяснить, о чем я говорю, на случай, если я не сделаю смысл.
Код: Выделить всё
using System.Diagnostics;
public static class Program1 {
private const int Depth = 1000;
private class Foo;
public static void Main() {
List list1 = [];
NoteTypes(Depth, list1);
List list2 = [];
NoteTypes(Depth, list2);
for (var i = 0; i != Depth; ++i) {
Trace.Assert(ReferenceEquals(list1[i], list2[i]));
}
}
public static void NoteTypes(int depth, List types) {
if (depth
Подробнее здесь: [url]https://stackoverflow.com/questions/79801477/how-does-the-clr-implement-static-fields-in-generic-types[/url]
Мобильная версия