Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Classe Ref<T>
A Ref<T> classe é um tipo apenas utilizável na pilha que armazena uma referência para um valor de um tipo especificado. É semanticamente equivalente a um valor ref T, mas pode usá-lo como tipo de campo noutro tipo apenas de pilha struct. Usa-o em vez de ref T campos, que o C# atualmente não suporta.
APIs da Plataforma:
Ref<T>,ReadOnlyRef<T>
Como funciona
Observação
Devido à forma como é implementado em diferentes contratos .NET Standard, o Ref<T> apresenta algumas pequenas diferenças no .NET Standard 1.4 e no .NET Standard 2.1 (e nos runtimes equivalentes do .NET Core). Em particular, no .NET Standard 1.4, só pode ser usado para referenciar campos dentro de um objeto, em vez de valores arbitrários apontados por uma referência gerida. Isto porque as APIs subjacentes usadas no .NET Standard 1.4 não têm suporte incorporado para este Span<T> tipo.
Ref<T> no .NET Standard 1.4
Como mencionado anteriormente, no .NET Standard 1.4, Ref<T> só pode apontar para locais dentro de um dado object. Considere o seguinte código:
// Be sure to include this using at the top of the file:
using Microsoft.Toolkit.HighPerformance;
// Define a sample model
class MyModel
{
public int Number = 42;
}
var model = new MyModel();
// Create a Ref<T> pointing to the MyModel.Number field
Ref<int> byRef = new Ref<T>(model, ref model.Number);
// Modify the field indirectly
byRef.Value++;
Console.WriteLine(model.Number); // Prints 43!
Advertência
O Ref<T> construtor não valida os argumentos de entrada, o que significa que é tua responsabilidade passar um campo válido object e uma referência a um campo dentro desse objeto. Não o fazer pode fazer com que a Ref<T>.Value propriedade devolva uma referência inválida.
Ref<T> no .NET Standard 2.1
No .NET Standard 2.1, Ref<T> pode apontar para qualquer ref T valor:
int number = 42;
// Create a Ref<int> pointing to 'number'
Ref<int> byRef1 = new Ref<int>(ref number);
// Modify 'number'
byRef1.Value++;
Console.WriteLine(number); // Prints 43!
Advertência
Este tipo tem algumas ressalvas e deve ser usado com cuidado, pois pode levar a crashes em tempo de execução se uma Ref<T> instância for criada com uma referência inválida. Em particular, deve criar apenas uma Ref<T> instância apontando para valores cuja duração seja maior do que a do Ref<T> em uso. Considere o seguinte trecho:
public static ref int GetDummyReference()
{
int number = 42;
Ref<int> byRef = new Ref<T>(ref number);
return ref byRef.Value;
}
Isto compila e corre bem, mas o devolvido ref int será inválido (ou seja, não aponta para uma localização válida) e pode causar crashes se for desreferenciado. É sua responsabilidade acompanhar a vida útil dos valores referenciados por novos Ref<T> valores.
Observação
Embora seja possível criar um Ref<T> valor que envolva uma null referência, usando a default(Ref<T>) expressão, o Ref<T> tipo não foi concebido para ser usado com referências anuláveis e não inclui as funcionalidades adequadas para validar a referência interna. Se precisares de devolver uma referência que possa ser definida para null, usa os NullableRef<T> tipos e NullableReadOnlyRef<T> .
ReadOnlyRef<Classe T>
A classe ReadOnlyRef<T> é um tipo exclusivamente em pilha que espelha Ref<T>, exceto que o seu construtor aceita um parâmetro in T (referência somente de leitura), em vez de um ref T. De forma semelhante, a sua Value propriedade tem um ref readonly T tipo de retorno em vez de ref T.
Exemplos
Podes encontrar mais exemplos nos testes unitários.
.NET Community Toolkit