Есть ли указатель в C # как C ++? Это безопасно? - PullRequest
44 голосов
/ 25 февраля 2010

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

Ответы [ 5 ]

41 голосов
/ 25 февраля 2010

Если вы реализуете древовидную структуру в 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)
32 голосов
/ 25 февраля 2010

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

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

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

Для примеров смотрите здесь и MSDN .

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

Increment(&count);

Используйте это вместо этого, и код будет БЕЗОПАСНЫМ и ЧИСТЫМ.

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

Increment(ref count);
19 голосов
/ 25 февраля 2010

Есть ли указатель в C # тоже?

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

Используете ли вы этот сейф?

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

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

4 голосов
/ 25 февраля 2010
2 голосов
/ 25 февраля 2010

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...