Jon McKee
На занятия, ref
как правило, он не очень хорошо работает с точки зрения производительности. Это эквивалентно псевдониму или ссылке из C++. Так что для void foo(ref SomeClass s)
, вместо s
будучи копией референциального аргумента, он и есть аргумент. Например:
void foo(ref SomeClass s) { s = new SomeClass(); }
void foo2(SomeClass s) { s = new SomeClass(); }
//....
SomeClass x = new SomeClass();
foo(ref x); //x now points to the new SomeClass instance
foo2(x); //x doesn't change, the assignment is local to the function only
Поскольку копирование указателей не является узким местом в подавляющем большинстве программ,
ref
речь идет скорее о гибкости, чем о производительности при работе с классами.
Для структур, как вы уже заметили, это позволяет избежать копирования структуры. Структура не обязательно должна быть большой, чтобы это было полезно для производительности. Например, представьте себе большой, плотный цикл, который передает относительно небольшую структуру функции. Еще хуже, представьте, что функция не может быть встроена и обновляет структуру, возвращая ее. Это 3 копии на вызов - аргумент, возврат, назначение возврата. С помощью
ref
вы могли бы избежать всех трех копий.
Я думаю, что вы также слишком быстро игнорируете сообщение Гриффа. Он намекает на то, что вы не всегда можете просто сделать структуру классом. Это принципиально разные типы, которые выделяются по-разному с разными свойствами и предположениями, которые делает о них компилятор. Стек против основной памяти (как выделение, так и доступ), очистка, наследование и т. д.-Все это влияет на производительность и оптимизацию.
Доктора:
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/ref-returns[
^]
Member 14707431
Привет, Джон,
спасибо за ваше доброе и терпеливое объяснение.
Ваши комментарии очень полезны. Да, я согласен с вами, что ref-это не только концепция, связанная с производительностью. Для Реф лучше для struct копировать не только на большой структуре, но и по несколько экземпляров небольшой структуры.