В C # можно объявить структуру (или класс), которая имеет член типа указателя, например:
unsafe struct Node
{
public Node* NextNode;
}
Всегда ли безопасно (ошибаться ... на мгновение игнорировать этот ироничный маленький unsafe
флаг ...) использовать эту конструкцию? Я имею в виду долгосрочное хранение в куче. Из того, что я понимаю, GC может свободно перемещать вещи, и, хотя он обновляет ссылки на что-то, что было перемещено, он также обновляет указатели? Я предполагаю нет, что сделало бы эту конструкцию очень небезопасной, верно?
Я уверен, что есть альтернативы для этого, но назовите это болезненным любопытством.
РЕДАКТИРОВАТЬ: Кажется, есть некоторая путаница. Я знаю, что это не очень хорошая конструкция, я чисто хочу знать, является ли она когда-либо безопасной конструкцией, то есть: гарантированно ли указатель будет продолжать указывать на то, на что вы изначально указывали?
Исходный C-код использовался для обхода дерева (сначала глубиной) без рекурсии, где дерево хранится в массиве. Затем массив перемещается путем увеличения указателя, если только не выполнено определенное условие, тогда указатель устанавливается на NextNode, где обход продолжается. Конечно, то же самое можно сделать в C #:
struct Node
{
public int NextNode;
... // other fields
}
Где int
- это индекс в массиве следующего узла. Но по соображениям производительности я бы в конечном итоге возился с указателями и массивами fixed
, чтобы избежать проверки границ в любом случае, и оригинальный C-код казался более естественным.