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