ref 结构类型(C# 参考)

你可以在结构类型的声明中使用 ref 修饰符。 ref struct 类型的实例是在堆栈上分配的,不能转义到托管堆。 为了确保这一点,编译器将 ref struct 类型的使用限制如下:

  • ref struct 不能是数组的元素类型。
  • ref struct 不能是类或非 ref struct 的字段的声明类型。
  • ref struct 不能实现接口。
  • ref struct 不能被装箱为 System.ValueTypeSystem.Object
  • ref struct 不能是类型参数。
  • ref struct 变量不能由 Lambda 表达式本地函数捕获。
  • ref struct 变量不能在 async 方法中使用。 但是,可以在同步方法中使用 ref struct 变量,例如,在返回 TaskTask<TResult> 的方法中。
  • ref struct 变量不能在迭代器中使用。

可以定义一次性的 ref struct。 为此,请确保 ref struct 符合一次性模式。 也就是说,它有一个实例或扩展 Dispose 方法,该方法是可访问、无参数的并且具有 void 返回类型。

从 C# 11 开始,ref struct 可以包含 ref 字段。 要声明 ref 字段,请使用声明 ref 局部变量所用的相同语法。 初始化 ref 字段后,可能会对其进行重新分配。 编译器确保存储在 ref 字段中的引用的生存期不会超过它引用的值。 有关范围规则的信息,请参阅方法参数一文的引用和值的范围部分。

通常,如果需要一种同时包含 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>

C# 语言规范

有关详细信息,请参阅 C# 语言规范中的结构部分。

有关 C#7.2 及更高版本中引入的功能的更多信息,请参见以下功能建议说明:

另请参阅