Я пишу приложение, которые работают с древовидной структурой данных. Я записал это с C++, теперь я хочу записать это C#. Я использую указатели для реализации древовидной структуры данных. Существует ли указатель в C# также? Действительно ли безопасно использовать его?
Если вы реализуете древовидную структуру на C # (или Java, или на многих других языках), вы должны использовать ссылки вместо указателей. NB. ссылки в C ++ не совпадают с этими ссылками.
Использование похоже на указатели по большей части, но есть преимущества, такие как сборка мусора.
class TreeNode
{
private TreeNode parent, firstChild, nextSibling;
public InsertChild(TreeNode newChild)
{
newChild.parent = this;
newChild.nextSibling = firstChild;
firstChild = newChild;
}
}
var root = new TreeNode();
var child1 = new TreeNode();
root.InsertChild(child1);
Интересные места:
*
при объявлении членов ->
для доступа к членам IDisposable
) В C# тоже есть указатель?
Да, объявленный с помощью синтаксиса int* varName;
.
Безопасно ли такое использование?
Нет, указатели не безопасны.
Существуют безопасные способы построения структуры данных без указателей. Если узлы являются классами, то они автоматически будут ссылочными типами, поэтому указатели не нужны. В противном случае, вы можете заключить их в коробку со ссылкой.
На MSDN есть отличная серия "Структуры данных, реализованные в .Net 2".
Они включают примеры кода для таких вещей, как двоичное дерево поиска, граф, SkipList, NodeList и т.д. Код довольно полный и включает несколько страниц документации о том, почему эти структуры работают и т.д.
Ни одна из них от Microsoft не использует указатели. Вообще, в C# они никогда не нужны. Бывают случаи, когда их использование было бы приятным, или они просто являются способом мышления, который вы взяли из C++. Но обычно можно найти способ не использовать их.
Самая большая причина, по которой не стоит использовать небезопасный код для указателей, заключается в том, что вы теряете соответствие Medium Trust. Вы не можете работать через такие механизмы, как click once, asp.net сайты, и Silverlight тоже не позволяет их использовать. Придерживайтесь ссылок и полностью управляемых концепций, чтобы ваш код мог работать в большем количестве мест.
Да, есть указатель: IntPtr
Википедия: «который является безопасным управляемым эквивалентом int * и не требует небезопасного кода»
YES. В C# есть указатели.
НЕТ. Они НЕ безопасны.
Вы должны использовать ключевое слово unsafe
, когда используете указатели в C#.
Примеры смотрите здесь и MSDN.
static unsafe void Increment(int* i)
{
*i++;
}
Increment(&count);
Используйте это вместо этого, и код будет безопасным и чистым.
static void Increment(ref int i)
{
i++;
}
Increment(ref count);