Заменяет ли символ ^ "ref" в C # при передаче параметров в коде C ++ / CLI? - PullRequest
19 голосов
/ 08 июля 2011

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

void MyFunction(ref Dog dog)

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

void MyFunction(Dog ^ dog)

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

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

Dog ^ myDog = gcnew Dog();

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

Спасибо!

Ответы [ 4 ]

31 голосов
/ 08 июля 2011

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

void MyFunction(Dog^% dog)

Если Dog является типом значения (struct в C #)тогда эквивалент C ++ / CLI:

void MyFunction(Dog% dog)

Как декоратор типа , ^ примерно соответствует * в C ++, а % примерно соответствует &в C ++.

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

2 голосов
/ 08 июля 2011

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

Dog ^ mydog = gcnew Dog();

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

Итак:

void MyFunction(Dog ^ dog)

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

void MyFunction(Dog &dog);

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

РЕДАКТИРОВАТЬ: Ну, это не то же самое, это% не &, что имеет смысл, что они должны изменить это тоже.Глупый C ++ / CLI.

1 голос
/ 08 июля 2011

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

1 голос
/ 08 июля 2011

Из MSDN - ^ (Handle to Object on Managed Heap):

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

И:

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

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