из C ++ в C #: никогда не возвращать ссылку на локальный объект? - PullRequest
5 голосов
/ 03 июля 2011

В C ++ есть совет: «Никогда не возвращать ссылку на локальный объект», как указано ниже в «C ++ Primer»:

"При возврате ссылки необходимо понимать одну важную вещь: никогда не возвращать ссылку на локальную переменную.

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

 // Disaster: Function returns a reference to a local object
 const string &manip(const string& s)
 {
      string ret = s;
      // transform ret in some way
      return ret; // Wrong: Returning reference to a local object!
 }

"Эта функция завершится с ошибкой во время выполнения, поскольку она возвращает ссылку на локальный объект. Когда функция завершается, память, в которой находится ret, освобождается. Возвращаемое значение относится к памяти, которая больше не доступна программе. «

Вопрос: так это все еще относится к C #? или это не имеет значения, как вводится GC?

Ответы [ 2 ]

5 голосов
/ 03 июля 2011

Невозможно вернуть ссылки на локальные переменные в .NET

См .: Почему C # не поддерживает возврат ссылок?

См. Также: Ref возвращается и ref localals (блог Эрика Липперта)

4 голосов
/ 03 июля 2011

Язык C # не позволяет этого. В C # есть два очень разных вида ссылок:

1) Ссылки на классы и аналогичные «Типы ссылок». Поскольку их цель всегда размещается в куче, ссылка всегда будет действительной после возврата.

2) Ссылки на локальные переменные / параметры. Вызывается managed references в CLR. Например:

void DoSomething(ref int i, ref object o)

Вы не можете объявить тип возврата, который использует этот вид ссылки в C # (сам CLR предлагает ограниченную поддержку для этого). Поскольку вы можете передавать их только другим функциям в качестве параметров, не можете сохранять их в полях и не можете их возвращать, невозможно сохранить один из них после возврата из функции. Поэтому снова использовать их безопасно.

В основном в C # вы можете использовать их только для параметров передачи по ссылке. Обратите внимание, что вы можете иметь ref переменную ссылочного типа (ref object o), но не ссылку на ссылку ref ref int i.

Эрик Липперт несколько дней назад опубликовал запись в блоге по этому виду ссылок, подробно описав проблемы с ref возвращаемыми значениями: Ref return и ref localals

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