Хранение только для чтения ссылки на структуру в поле экземпляра - PullRequest
0 голосов
/ 09 октября 2018

С C # 7.2 вы можете передавать структуры с помощью параметра in, который в основном равен readonly ref.

class Model {
    private readonly TStruct _s;

    Model(in TStruct s) {
        _s = s;
    }
}

В приведенном выше коде, где TStruct является struct, я назначаю ссылку на _s или копирую всю структуру? Что я хочу, чтобы избежать ненужного копирования памяти.Поскольку мне нужно только прочитать данные из s, я бы подумал, что readonly ref сделает это.К сожалению, я не могу пометить _s как readonly ref.

1 Ответ

0 голосов
/ 09 октября 2018

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

Да, и это EXPLICIT.

В приведенном выше коде, где TStruct является структурой, я присваиваю ссылку на _s или копирую всю структуру?

Копируем всю структуру в тот момент, когда вы ее присваиваете.Вы можете избежать еще одной копии, возможно (детали реализации), вызывающей конструктор, потому что в нее передается только указатель, но это может быть оптимизировано JIT.

В приведенном выше коде, где TStruct являетсяstruct, я назначаю ссылку на _s или копирую всю структуру?

Тогда не используйте struct.Как правило, указатели могут использоваться только для вызовов функций или временных переменных - _s не является таковым.Они предназначены для того, чтобы избежать копирования структур во время операций, а НЕ для изменения модели хранилища.

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