Ссылки на С++ Ссылки Vs С#

Каковы сходства/различия между ссылкой С++ и ссылкой С#?

Изменить:

Я говорю об объектных ссылках, так как я новичок, я не знал, что такая простая строка вызовет двусмысленность, как я читал. Всякий раз, когда используется термин "ссылка" , его в контексте ссылки на объект, в противном случае его явно цитируется как "управляемые ссылки" .

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

Этот вопрос не заслуживает того, чтобы его закрывали. Как новички, такие как я, могут учиться на проницательности, которую предоставили многие опытные люди.

Ответ 1

Ссылки на С# ближе к указателям на С++, чем к ссылкам на С++.

Ссылки на С# могут быть нулевыми и иметь семантику назначения, аналогичную указателям. Разница в том, что они черные ящики (вы не можете преобразовать их в интегральные типы), и вы не можете делать арифметику на них. Они также могут указывать только на ссылочные типы.

Ссылки на С++ совершенно разные (кроме того, что они также скомпилированы для указателей). Они ближе к .net-управляемым ссылкам, которые используются для параметров ref. Но даже тогда семантика присваивания отличается.


Инициализация ссылки - это нечто совсем иное, чем назначение. Несмотря на то, а оператор не работает над ссылкой.

Ответ 2

Они не очень похожи.

Единственное, что в С#, похожее на ссылку С++, - это параметры с ключевым словом ref. Не существует эквивалентов ссылочных переменных или полей.

Ссылка на С# во многом похожа на указатели С++. Они могут быть null и т.д.

Изменить

В С# термин "ссылка" всегда означает ссылку на объект. Де-ссылка автоматически, что может сделать сравнение с С++ немного сложнее:

string h = "hello";
int len = h.Length;   // dereference, Length is a property of the instance
h = null;             // no de-referencing, h itself becomes null.

Ответ 3

Обновление

По-видимому, я неправильно понял вопрос: я понял слово "ссылка", ссылаясь на "управляемые ссылки", а не на "ссылки на объекты". "Управляемые ссылки" (предпочтительно называемые "управляемые указатели", которые я не делал изначально) - это функция, которая допускает нечто вроде ref int в С# и очень похоже на ссылки на С++. Однако они представляют собой концепцию .NET Framework, но не концепцию С#. По контрасту "ссылка на объект" (или просто "ссылка" ) просто ссылается на ссылочный тип.

В моем ответе ниже я имею в виду управляемые ссылки/указатели, не объекты.


В реализации они почти точно такие же: просто причудливые указатели, которые не должны быть null.

В коде они несколько разные: во-первых, у вас не может быть "ссылочная переменная" на С#, но вы можете в С++.

i.e., вы можете сказать

int x = 5;
int& y = x;

в С++, но вы не можете сказать:

int x = 5;
ref int y = x;

в С#.

Но применяется обычная семантика присваивания: Присвоение ссылки присваивается цели; нет способа изменить ссылку на С# или С++.


Однако технически не полностью запрещен полностью с помощью платформы .NET, чтобы иметь ссылку на int; на самом деле такой тип существует. Но ни один язык .NET(кроме чистого ИЛ) не имеет возможности объявить переменную как тип управляемой ссылки, насколько я знаю.

Ответ 4

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

Одним из основных упрощений С# (или системы типа CLR) над собственным С++ является четкое разделение на значения и ссылочные типы с возможностью передачи как по значению, так и по ссылке.

В некоторой степени упрощенная С++, с другой стороны, знает только "типы значений", где приложение должно решить, управляется ли их время жизни автоматически или вручную. В С++ термин "ссылочный тип" обозначает новый тип, объявленный путем записи T&, где T - допустимое имя типа. В С++ ссылка - это тонкая вещь: декларация T& определяет "ссылку l-value на T", а T&& определяет "ссылку r-value на T" (ссылка на временный объект, новая концепция введенные С++ 0x) оба типа разных типов. Правила взаимной привязки (если они переданы в качестве аргумента, возвращены из функции или использованы как l-значение или r-значение в выражении присваивания)

  • T
  • T const &
  • T const &&
  • T&
  • T&&

- это кошмар, хотя они открывают возможности для некоторых очень полезных и сильных парадигм. Конечно, поскольку T* (тип указателя) можно заменить на T в T& или любой из его альтернатив, вы можете определить тип ссылки на тип указателя со всеми комбинациями, описанными выше. Противоположность, однако, невозможна, "указатель на ссылочный тип" не разрешен.

Да, надеюсь, я еще больше смутил все...

Приветствия,

Пол