Модификатор scoped
Ключевое слово scoped перед ref
в параметре говорит, что ссылку нельзя сохранять
дольше текущего вызова - например, в поле класса.
Так снижают риск висячих ссылок на стековые
данные. Код остаётся без unsafe.
Синтаксис
void Метод(scoped ref тип имя)
Пример
Давайте выведем число через метод с scoped ref:
using System;
class Program
{
static void Show(scoped ref int num)
{
Console.WriteLine(num);
}
static void Main()
{
int val = 7;
Show(ref val);
}
}
Результат выполнения кода:
7
Пример
Давайте увеличим значение через scoped ref:
using System;
class Program
{
static void Inc(scoped ref int num)
{
num++;
}
static void Main()
{
int val = 5;
Inc(ref val);
Console.WriteLine(val);
}
}
Результат выполнения кода:
6
Пример
Давайте прочитаем элемент массива через
scoped ref:
using System;
class Program
{
static void ShowCell(scoped ref int cell)
{
Console.WriteLine(cell);
}
static void Main()
{
int[] nums = {1, 2, 3, 4, 5};
ShowCell(ref nums[2]);
}
}
Результат выполнения кода:
3
Пример
Давайте сравним локальную переменную до и после
вызова с scoped ref:
using System;
class Program
{
static void Set(scoped ref int num, int value)
{
num = value;
}
static void Main()
{
int val = 1;
Set(ref val, 12);
Console.WriteLine(val);
}
}
Результат выполнения кода:
12