.NET кучи и стеки Это подробное описание работы стека и кучи.
C # и многие другие языки ООП, использующие кучу, для общего использования в качестве справочного языка Обрабатывает не указатели для ссылок в этом контексте (C # также может использовать указатели!) Аналогии с указателями работают для некоторыхобщие понятия, но эта концептуальная модель не подходит для таких вопросов, как это.См. Отличный пост Эрика Липперта на эту тему Дескрипторы не являются адресами
Нельзя говорить, что дескриптор - это размер указателя. (хотя это может совпадатьбыть одинаковыми) Дескрипторы являются псевдонимами для объектов, не обязательно, чтобы они были формальным адресом объекта.
В этом случае CLR использует реальные адреса для дескрипторов: по приведенной выше ссылке:
... CLR фактически реализует ссылки на управляемые объекты в качестве адресов принадлежащих объектамсборщиком мусора, но это деталь реализации.
Так что да, дескриптор, вероятно, составляет 4 байта в 32-битной архитектуре и 8 байтов в 64-байтовой архитектуре, но это не «наверняка», и это не напрямуюиз-за указателей .Стоит отметить, что в зависимости от реализации компилятора и используемых диапазонов адресов некоторые типы указателей могут различаться по размеру .
При всем этом контексте вы, вероятно, можете смоделировать это по аналогии с указателем,но важно понимать, что дескрипторы не обязательно должны быть адресами.CLR может изменить это, если захочет в будущем, и потребители CLR не должны знать об этом лучше.
Окончательный вариант этой тонкой точки:
Это C #Указатель:
int* myVariable;
Это дескриптор C #:
object myVariable;
Они не одинаковы.
Вы можете делать такие вещи, как математикана указатели, что вы не должны делать с ручками.Если ваш дескриптор реализован как указатель, и вы используете его как указатель, то вы неправильно используете дескриптор, что может впоследствии привести к неприятностям.