Как CLR реализует статические поля в универсальных типах? [дубликат]C#

Место общения программистов C#
Ответить
Anonymous
 Как CLR реализует статические поля в универсальных типах? [дубликат]

Сообщение Anonymous »

Этот вопрос крутился у меня в голове уже несколько лет, и мне захотелось наконец задать его.
Вопрос: как 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]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»