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 и более поздних версиях, см. в следующих заметках о функциях.

См. также раздел