Подтвердить что ты не робот

Символ ^ заменяет С# "ref" в параметре, проходящем в коде С++/CLI?

В С# передача по ссылке:

void MyFunction(ref Dog dog)

Но в примерах кода С++/CLI, которые я видел до сих пор, не используется ref, но вместо этого используется символ ^:

void MyFunction(Dog ^ dog)

Является ли использование символа ^ прямой заменой ref при передаче параметра? или у него есть какой-то другой смысл, о котором я не знаю?

Дополнительный вопрос: я также вижу много:

Dog ^ myDog = gcnew Dog();

Похоже, что он используется как * (указатель) в С++.. С ним работает аналогично?

Спасибо!

4b9b3361

Ответ 1

Если Dog является ссылочным типом (class в С#), то эквивалент С++/CLI:

void MyFunction(Dog^% dog)

Если Dog - тип значения (struct в С#), то эквивалент С++/CLI:

void MyFunction(Dog% dog)

Как декоратор типа ^ грубо коррелирует с * в С++, а % грубо коррелирует с & в С++.

Как унарный оператор, вам все равно нужно использовать * в С++/CLI, где вы используете * в С++, но обычно вам нужно использовать % в С++/CLI, где вы используете & в С++.

Ответ 2

Оператор ^ ведет себя аналогично указателю в С++/CLI. Разница в том, что это указатель на сборщик мусора. Итак:

Dog ^ mydog = gcnew Dog();

просто говорит, что мы будем использовать новую управляемую память (gcnew) и передать управляемый указатель обратно в mydog.

Итак:

void MyFunction(Dog ^ dog)

Фактически проходит по адресу, а не ссылку, но они похожи. Если вы хотите перейти по ссылке в C/С++, вы выполните что-то вроде:

void MyFunction(Dog &dog);

в объявлении функции. Я предполагаю, что это будет то же самое для С++/CLI, но я никогда не пробовал. Я стараюсь не использовать ref, потому что не всегда ясно, что они есть.

EDIT: Ну, это не то же самое, это% not &, что имеет смысл, они тоже должны были бы изменить это. Stupid С++/CLI.

Ответ 3

От MSDN - ^ (Handle to Object on Managed Heap):

Объявляет дескриптор объекта в управляемой куче.

и

Общая среда исполнения языка поддерживает отдельную кучу, на которой реализуется точная, асинхронная, компактная сборка мусора. Чтобы работать правильно, он должен отслеживать все места хранения, которые могут указывать на эту кучу во время выполнения. ^ обеспечивает ручку, через которую сборщик мусора может отслеживать ссылку на объект в управляемой куче, тем самым будучи в состоянии обновлять его всякий раз, когда этот объект перемещается.

Ответ 4

Символ "^" указывает, что "Собака" - это объект CLR, а не традиционный объект С++, такой как "Dog *", который является указателем на объект С++ Dog. Это означает, что "собака-собака" имеет такое же значение, как "собака собаки" (не "собака-собака" ) в С#