Есть что-то вроде указателя C ++ в C #? [Дубликат]

Объявлено, но не определено переменная или функция.

Типичным объявлением переменной является

extern int x;

. Поскольку это только объявление, требуется одно определение. Соответствующим определением будет:

int x;

Например, следующее генерирует ошибку:

extern int x;
int main()
{
    x = 0;
}
//int x; // uncomment this line for successful definition

Аналогичные замечания относятся к функциям. Объявление функции без ее определения приводит к ошибке:

void foo(); // declaration only
int main()
{
   foo();
}
//void foo() {} //uncomment this line for successful definition

Будьте осторожны, чтобы выполняемая вами функция точно соответствовала той, которую вы объявили. Например, у вас могут быть несогласованные cv-квалификаторы:

void foo(int& x);
int main()
{
   int x;
   foo(x);
}
void foo(const int& x) {} //different function, doesn't provide a definition
                          //for void foo(int& x)

Другие примеры несоответствий включают

  • Функция / переменная, объявленная в одном пространстве имен, определенное в другом.
  • Функция / переменная, объявленная как член класса, определяемая как глобальная (или наоборот).
  • Тип возвращаемого значения функции, номер и типы параметров и соглашение о вызове не совсем точно согласуются.

Сообщение об ошибке из компилятора часто дает вам полное объявление переменной или функции, которая была объявлена, но не определена. Сравните его с определением, которое вы указали. Убедитесь, что каждая деталь соответствует.

42
задан Sam 1 August 2013 в 12: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)
38
ответ дан Daniel Earwicker 26 August 2018 в 07:15
поделиться

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

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

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

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

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

2
ответ дан Jason Short 26 August 2018 в 07:15
поделиться

Есть ли указатель на C #?

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

] Используется ли это безопасное?

Никакие указатели не являются безопасными.

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

18
ответ дан kennytm 26 August 2018 в 07:15
поделиться
[Д2] ДА. В C # есть указатели.

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

При использовании указателей на C # вам действительно нужно использовать ключевое слово unsafe.

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

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

Increment(&count);
Используйте это вместо этого, и код будет SAFE и CLEAN.

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

Increment(ref count);
29
ответ дан Pratik Deoghare 26 August 2018 в 07:15
поделиться
Другие вопросы по тегам:

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