Source
Devlog без QA | Розробка ігор | Коротко, а може і не дуже, про refКлючове слово ref використовується д...
419 Views/Reach
2026-01-30 18:06
Message №516
📱 Коротко, а може і не дуже, про refКлючове слово ref використовується для передачі параметрів за посиланням і створення посилальних змінних. За замовчуванням параметри передаються за значенням, а значення повертаються за значенням.Додавання ref у сигнатурі методу та при його виклику змінює поведінку на передачу за посиланням.Наприклад:public void Increment(ref int x) { x += 1; // Змінює початкову змінну виклику}int a = 5;Increment(ref a); // a стає 6
Тут і визначення методу, і виклик використовують ref. Виклик має використовувати той самий модифікатор, що й у сигнатурі, і до змінної-аргумента необхідно застосувати ref.Для чого це потрібно?1️⃣ Щоб змінювати значення аргументу напрямуВсе просто. Це потрібно, щоб метод працював напряму з оригінальною змінною, а не з її копією.Тобто ти передаєш у метод не “значення”, а “саму змінну”.2️⃣ Щоб уникати копіювання великих структурstruct передаються за значенням, тобто копіюються.Для великих структур це дорого.void Update(ref BigStruct data) { }
3️⃣ Для оптимізації hot-path кодуУ місцях, де код виконується дуже часто (рендер, фізика, математика):• ref зменшує кількість копій;• зменшує тиск на GC (опосередковано);• дає більш передбачувану роботу з памʼяттю.Саме тому ref активно використовується в Span<T>, ReadOnlySpan<T> та низькорівневому .NET коді👀 Нюанси:Ініціалізація перед викликом. Перед викликом Foo(ref x) змінна x уже повинна містити деяке значення.Необхідність явного ref. І в сигнатурі методу, і при його виклику має бути ключове слово ref.Взаємодія з іншими модифікаторами. ref сумісний з readonly для полів (в ref-структурі). До методів з async або yield застосовувати ref не можна, оскільки їхня поведінка не гарантує безпечності посилань.ℹ️ Джерела: [База] / [readonly/async]✈️ Gamedev | #уроки #посилання #ref #async #csharp