Теперь с C # 7 мы можем вернуться по ссылке с return ref
. Из того, что я собрал, ссылки 32 или 64 бит. Теперь, если бы у меня была структура Coord
с long X
и long Y
, это было бы 128 битов, так что было бы проще вернуть координаты (а также передать их) по ссылке, чтобы избежать копирования 128 биты.
С другой стороны, если бы я попытался return ref
a byte
, что составляет всего 8 бит, ссылка на него была бы намного больше, чем копирование самого байта, верно?
Итак, мой главный вопрос: Если объект, который мы хотим вернуть, может быть возвращен ref
(т. Е. Не локальной переменной), и его размер больше, чем размер ссылки, мы должны вернуться ref
Редактировать: Пример быстрого кода
// This size is 128 bytes, which is 2 or 4x larger than the size of a reference
public struct Coord
{
public long X, Y;
}
private Coord myCoord;
// This will return the Coord by value, meaning copying the full 128 bytes
public Coord GetCoordValue() => myCoord;
// This will return the Coord by reference, meaning copying only 32 or 64 bytes
public ref readonly Coord GetCoordRef() => ref myCoord;
Кроме того, эта конкретная структура очень проста, и она уже в 2/4 раза меньше, чтобы вернуться на ref
.
Редактировать 2: Я сделал GetCoordRef()
readonly
, чтобы вызывающая сторона не могла сохранить и изменить значение myCoord
, тем самым сохраняя инкапсуляцию, хотя я полагаю, что это все равно не будет умный по умолчанию использовать его.