Есть ли указатель в C# как C++? Действительно ли это безопасно?

Я пишу приложение, которые работают с древовидной структурой данных. Я записал это с C++, теперь я хочу записать это C#. Я использую указатели для реализации древовидной структуры данных. Существует ли указатель в C# также? Действительно ли безопасно использовать его?

45
задан Sam 1 August 2013 в 11:19
поделиться

5 ответов

Если вы реализуете древовидную структуру на 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);

Интересные места:

  • Нет необходимости изменять тип с помощью * при объявлении членов
  • Нет необходимости устанавливать для них значение NULL в конструкторе (они уже равны NULL)
  • Нет специального оператора -> для доступа к членам
  • Нет необходимости писать деструктор (хотя ищите IDisposable )
41
ответ дан 26 November 2019 в 21:07
поделиться

В C# тоже есть указатель?

Да, объявленный с помощью синтаксиса int* varName;.

Безопасно ли такое использование?

Нет, указатели не безопасны.

Существуют безопасные способы построения структуры данных без указателей. Если узлы являются классами, то они автоматически будут ссылочными типами, поэтому указатели не нужны. В противном случае, вы можете заключить их в коробку со ссылкой.

20
ответ дан 26 November 2019 в 21:07
поделиться

На MSDN есть отличная серия "Структуры данных, реализованные в .Net 2".

Структуры данных Часть 1

Они включают примеры кода для таких вещей, как двоичное дерево поиска, граф, SkipList, NodeList и т.д. Код довольно полный и включает несколько страниц документации о том, почему эти структуры работают и т.д.

Ни одна из них от Microsoft не использует указатели. Вообще, в C# они никогда не нужны. Бывают случаи, когда их использование было бы приятным, или они просто являются способом мышления, который вы взяли из C++. Но обычно можно найти способ не использовать их.

Самая большая причина, по которой не стоит использовать небезопасный код для указателей, заключается в том, что вы теряете соответствие Medium Trust. Вы не можете работать через такие механизмы, как click once, asp.net сайты, и Silverlight тоже не позволяет их использовать. Придерживайтесь ссылок и полностью управляемых концепций, чтобы ваш код мог работать в большем количестве мест.

2
ответ дан 26 November 2019 в 21:07
поделиться

YES. В C# есть указатели.

НЕТ. Они НЕ безопасны.

Вы должны использовать ключевое слово unsafe , когда используете указатели в C#.

Примеры смотрите здесь и MSDN.

static unsafe void Increment(int* i)
{
    *i++;
}

Increment(&count);

Используйте это вместо этого, и код будет безопасным и чистым.

static void Increment(ref int i)
{
    i++;
}

Increment(ref count);
33
ответ дан 26 November 2019 в 21:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: