C# · Avançado · Inglês · Técnico
ref struct
Struct restrita à pilha, que não pode ser campo de classe, ser boxeada nem atravessar um await; é o que permite a tipos como Span<T> apontar para memória com segurança.
Onde usar
Você as escreve em parsers e buffers de alto desempenho, e as reconhece por erros como 'não pode ser usado em lambda' ao capturar um Span. A saída costuma ser usar Memory<T> ou reorganizar o código.
Em código
ref struct Janela {
private readonly Span<int> _d;
public Janela(Span<int> d) => _d = d;
public int Soma() {
int s = 0;
foreach (var x in _d) s += x;
return s;
}
}Exemplos
Span is a ref struct, so it can't be a field in a class.
Span é uma ref struct, então não pode ser campo de uma classe.
You can't capture a ref struct in a lambda.
Você não pode capturar uma ref struct em uma lambda.
Cuidado
Não use ref struct quando o dado precisar ficar em campo de classe ou sobreviver a um await; use uma struct normal ou Memory<T>.