ref
Типы структур (справочник по C#)
Модификатор ref
можно использовать в объявлении типа структуры. Экземпляры ref struct
типа выделяются в стеке и не могут выйти в управляемую кучу. Чтобы убедиться в этом, компилятор ограничивает использование ref struct
типов следующим образом:
- Не
ref struct
может быть типом элемента массива. - Не
ref struct
может быть объявленным типом поля класса или не можетref struct
быть типом. - Не
ref struct
может реализовать интерфейсы. - Не
ref struct
может быть упаковано в System.ValueType или System.Object. - Не
ref struct
может быть аргументом типа. - Переменная
ref struct
не может быть захвачена лямбда-выражением или локальной функцией. - Переменная
ref struct
не может использоваться в методеasync
. Однако переменные можно использоватьref struct
в синхронных методах, например в методах, возвращающих Task или Task<TResult>. - Переменную
ref struct
нельзя использовать в итераторах.
Можно определить утилизируемый ref struct
объект . Для этого убедитесь, что соответствует ref struct
шаблону для удаления. То есть у него есть метод экземпляра Dispose
, который является доступным, без параметров и имеет тип возвращаемого void
значения. Оператор using или объявление можно использовать с экземпляром утилизируемого ref struct
объекта .
Как правило, тип определяется ref struct
, когда требуется тип, который также включает в себя элементы ref struct
данных типов:
public ref struct CustomRef
{
public bool IsValid;
public Span<int> Inputs;
public Span<int> Outputs;
}
Чтобы объявить ref struct
как readonly
, объедините модификаторы readonly
и ref
в объявлении типа (модификатор readonly
должен находиться перед модификатором ref
):
public readonly ref struct ConversionRequest
{
public ConversionRequest(double rate, ReadOnlySpan<double> values)
{
Rate = rate;
Values = values;
}
public double Rate { get; }
public ReadOnlySpan<double> Values { get; }
}
В .NET примерами ref struct
являются System.Span<T> и System.ReadOnlySpan<T>.
ref
Поля
Начиная с C# 11, можно объявить ref
поле в , как показано в ref struct
следующем примере:
public ref struct RefFieldExample
{
private ref int number;
public int GetNumber()
{
if (System.Runtime.CompilerServices.Unsafe.IsNullRef(ref number))
{
throw new InvalidOperationException("The number ref field is not initialized.");
}
return number;
}
}
Поле ref
может иметь null
значение . Используйте метод , Unsafe.IsNullRef<T>(T) чтобы определить, имеет ли ref
поле значение null
.
Модификатор readonly
можно применить к полю ref
следующими способами:
readonly ref
: можно переназначить такое поле оператором= ref
только внутри конструктора илиinit
метода доступа. Вы можете присвоить значение оператору в=
любой момент, разрешенный модификатором доступа к полю.ref readonly
: в любой момент нельзя присвоить такому=
полю значение с оператором . Однако можно переназначить поле с= ref
помощью оператора .readonly ref readonly
: можно переназначить такое поле только в конструкторе или методеinit
доступа. В любой момент нельзя присвоить значение полю.
Компилятор гарантирует, что ссылка, хранявшаяся в ref
поле, не будет выходить за пределы значения, на которое она ссылается. Сведения о правилах область см. в разделе Область ссылок и значений статьи Параметры метода.
Спецификация языка C#
Дополнительные сведения см. в разделе Структуры в спецификации языка C#.
Дополнительные сведения о функциях, появившихся в C# 7.2 и более поздних версиях, см. в следующих заметках о функциях.
- C# 7.2 . Безопасность во время компиляции для ссылочных типов
- C# 11 — поля ссылок и область действия