Различие между указателем в C++ и ссылочным типом в C#

В C++ указатель является указателем на адрес памяти, где другая переменная хранится, и в C# ссылка - некоторые как то же. Каково различие между этими двумя?

7
задан SwDevMan81 27 January 2010 в 12:51
поделиться

6 ответов

в C # Тип ссылки будет автоматически собран мусор, когда больше не нужно.

9
ответ дан 6 December 2019 в 09:19
поделиться

Так называемые ссылки в C # реализуются указателем на указатель на фактический объект. Они называются ручками, и в то время как сама ручка остается фиксированной в течение всего времени жизни программы, внутренний указатель меняется, поскольку объект перемещается в память с помощью сборщика мусора во время фазы Compacting Memory.

1
ответ дан 6 December 2019 в 09:19
поделиться

Это разные звери. В C ++ Boost :: Shared_PTR несколько похож на референы C #, но также является явным зверем (из этих двух).

Ссылки на объект, который будет утилизироваться сборщиком мусора. То же самое происходит в случае Shared_PTR. Тем не менее, есть концептуальная разница между тем, как C # и Boost :: Срок службы объекта CARED_PTR (см. Ниже).

Указатели C ++ могут указывать на что угодно, выделено либо на стеке (в этом случае, утилизируя не нужно), статически на кучу, или что-то выделено вручную, по требованию, который тогда должен быть освобожден, и он полностью на ответственности Отказ

Различия между Shared_PTR и C # Ссылки:

Shared_PTR является ссылочным счетчиком. Это считает, сколько клонов вашего указателя существуют и располагает объектом, если нет. Это не обеспечивает раствора от перекрестных ссылок (или круговых ссылок ), когда точки B, которые указывают на A, но как A и B больше не требуются.

C # Коллекция мусора имеет дело с этим. C # не считается ссылками. Вместо этого он поддерживает список доступности - то, что можно получить доступ через все открытые указатели, которые у нас есть. Что не может быть расположено. Этот подход безопаснее, но имеет несколько недостатков с точки зрения предсказуемости производительности.

1
ответ дан 6 December 2019 в 09:19
поделиться

Первое отличие состоит в том, что вы не можете использовать арифметику указателя на ссылках. В противном случае они в значительной степени то же самое.

  • Оба точка / ссылки на фактический объект.
  • Оба могут быть NULL / NULL (то есть не указывая на действительный объект)
  • , оба могут быть назначены новым объектом

Еще одно отличие состоит в том, что сборщик мусора заботится о выделенных ресурсах в C # .. в C ++ , вы должны удалить их самостоятельно (или использовать Smart-Picketer).

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

0
ответ дан 6 December 2019 в 09:19
поделиться

Первая отличие состоит в том, что вы не можете использовать арифметику указателя на ссылках. В противном случае они в значительной степени то же самое.

  • Оба точка / ссылки на фактический объект.
  • Оба могут быть NULL / NULL (т. Е. Не указывая на действительный объект)
  • Оба могут быть назначены новый объект

Другое отличие состоит в том, что сборщик мусора заботится о выделенных ресурсах в C # .. в C ++ , вы должны удалить их самостоятельно (или использовать Smart-Picketer).

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

-121--3823416-

C ++ - указатель физического уровня, в котором он хранит значение физического адреса. C # Ссылка это скорее скрытый или непрозрачный указатель, где вы просто знаете, что он указывает на какой-то объект.

в C ++ вы работаете с указателями либо на физическом уровне - операция памяти или Используйте его доступа к объектам, которые он указывает.

// physical level operation

// set pointer to specific address
byte *pPointer = 0x00LB10;
// increment pointer
pPointer++; 

// OR
// dereference operation for classes and structure
pPointer->MyProperty

В C # вы можете использовать только ссылку (объект типа ссылочного типа) доступа к объектам.

MyReference.Property
0
ответ дан 6 December 2019 в 09:19
поделиться

Нет прямого способа сделать это.

Вы можете загрузить сценарий по запросу. (снова использует нечто похожее на то, что упомянул Игнасио, но намного чище).

Проверьте эту ссылку на наличие нескольких способов: http://ajaxpatterns.org/On-Demand_Javascript

Мой любимый вариант (не всегда применим):

<script src="dojo.js" type="text/javascript">
dojo.require("dojo.aDojoPackage");

Закрытие Google также обеспечивает аналогичную функциональность.

-121--801980-

У меня недостаточно контекста, чтобы дать правильный ответ, но я предложу вам максимально сделать код неизменным . Используйте поля public final . Больше не получает или setters : каждое поле должно быть определено конструктором . Ваш код короче, удобочитаем и не позволяет писать код с побочными эффектами.

Это не мешает передавать пустые аргументы конструктору, хотя... Вы по-прежнему можете проверить каждый аргумент в соответствии с предложением @ cletus, но я предложу вам бросить IllegalArgumentException вместо StartPointerException , который не дает нового намека на то, что вы сделали.

В любом случае, это то, что я делаю как можно больше, и это значительно улучшило мой код (читаемость, стабильность). Все в моей команде так и делают, и мы этим очень довольны. Мы узнали, что когда мы пытаемся написать какой-то erlang код, где все незыблемо.

Надеюсь, это поможет.

-121--148â2-

Для меня понятие является тем же или, по крайней мере, предназначено быть тем же самым, , но фактическое использование не является .

Когда мы говорим о указателях или ссылке, мы говорим о концепции. Эта переменная «указывает на» или ее «ссылка» на что-то другое, что-то, что хранится где-то еще.

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

Таким образом, концепция может быть связана с вашим адресом в реальном мире, это просто способ ссылаться на другую вещь, и эта ссылка может быть разделена, как многие люди, имеющие мой адрес.

Разница больше в том, как он был использован и что разрешено языком. Следует отметить, что детали реализации ссылки или указателя не являются неявными в самой концепции. В C #, которое продолжает быть истинным.

Ссылка является ссылкой, и, следовательно, просто не имеет смысла суммировать две ссылки или добавлять одну к ссылке... что это вообще значит? Я не могу добавить два домашних адреса (как Бейкер-стрит + Домашняя улица)...

В C++ детализация реализации ссылки фактически является ссылкой. Таким образом, указатель является не просто указателем, его также (и используется в качестве) адреса памяти. Таким образом, например, можно добавить к указателям,потому что на самом деле имеет смысл добавить два адреса памяти, чтобы получить другой, или добавить 4 к адресу памяти. Таким образом, на языке C++ указатель перестал быть понятием и стал именем, данным фактической детали реализации .

Поэтому в C # указатели и ссылки различны. Потому что через семантически смысл довольно похож, они хотели отличить от старого понятия C и C++, где указатель стал таким же, как адрес памяти.

Я рекомендую вам прочитать статью " Ссылки не адреса " от Эрик Липперт , где я считаю, что он делает большую работу, объясняя различия.

9
ответ дан 6 December 2019 в 09:19
поделиться
Другие вопросы по тегам:

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