IParsable e ISpanParsable
- IParsable e ISpanParsable
Converting Strings to .NET Objects – IParsable and ISpanParsable
Um novo recurso do C # 11 permite membros estáticos abstratos com interfaces. Isso permite definir métodos de classe a serem usados como um contrato com uma implementação de classe genérica, por exemplo usando operadores + e –. Com .NET 7, tipos numéricos implementam muitas novas interfaces. Esse recurso C # 11 não é apenas sobre matemática! O novo IParsable e ISpanParsable interfaces permitem criar objetos a partir de strings. Como essas interfaces podem ser usadas com restrições em tipos genéricos, a análise de cadeias para criar objetos agora é uma tarefa fácil com implementações genéricas. Este artigo mostra a implementação da string e da versão Span das interfaces de análise e o uso com tipos genéricos.

IFormattable
Vamos começar com uma interface que não é nova, mas cobre o outro lado da análise de uma sequência: converter o objeto em uma sequência. O IFormattable interface está disponível desde os primeiros dias de .LÍQUIDO. Ao contrário da interface parsable, os membros definidos no IFormattable interface são membros de instância.
Com o código de amostra, o ColorResult registro é dividido em vários arquivos usando partial palavra-chave. Em um arquivo, os membros do ColorResult são definidos como mostrado no seguinte snippet de código. Os outros arquivos que definem o ColorResult type implementa as interfaces necessárias. ColorResult contém dois valores de bytes. Dependendo do tipo de jogo, o número máximo é diferente. Com os tipos de jogos existentes, esses valores variam de 0 a 5.

Com a seguinte implementação do IFormattable interface, uma sequência é retornada para conter os dois valores do registro. O IFormattable interface especifica parâmetros para cadeias e culturas de formato. Com o ColorResult implementadas, diferentes cadeias de formato não são usadas e não há diferença com base na cultura, é por isso que os parâmetros são ignorados.

ISpanFormattable
Para evitar a criação de novos objetos que precisam ser coletados no lixo, o ISpanFormattable interface está disponível desde .LÍQUIDA 6. Essa interface permite gravar a representação de string de um objeto em um Span<char> instância. O seguinte snippet de código mostra a implementação do ISpanFormattable interface. Se o tamanho do intervalo não for grande o suficiente, o TryFormat implementação retorna false. Caso contrário, os números com um separador são escritos no intervalo:

O IFormattable a implementação da interface agora é alterada para usar a versão de extensão alocando uma matriz de caracteres com o tamanho necessário e passe uma Span referenciando essa matriz ao TryFormat método:

IParsable e ISpanParsable
Para criar um novo objeto a partir da representação da string, as interfaces IParsable e ISpanParsable estão disponíveis com .LÍQUIDA 7. Essas interfaces definem membros abstratos estáticos para converter uma sequência e um intervalo para o tipo genérico, conforme mostrado nos seguintes trechos de código:


Você pode se perguntar sobre o NotNullWhen e o MaybeNullWhen atributos. Esses atributos são usados para informar ao compilador que o método retorna true se o objeto não for nulo e false se o objeto for nulo. O compilador usa essas informações para evitar verificações nulas. O atributo MaybeNullWhen é usado para informar ao compilador que o objeto é nulo se o método retornar false. O compilador usa t
Implementando o ISpanParsable
O ToString método retorna uma sequência contendo os membros do ColorType separado por dois pontos. Usando o padrão de lista disponível desde C # 10 com correspondência de padrões, com o seguinte snippet de código, se o padrão corresponder a dois caracteres espaçados por dois pontos, um novo ColorField instância é criada e retornada. Caso contrário, o método retornará nulo:

Usando o ISpanParsable
Com esta implementação, um método genérico pode ser implementado para usar qualquer tipo que implemente o IParsable interface. Com o método de extensão genérico AddMove, uma restrição é definida para exigir o IParsable<TResult> a ser implementado com o tipo genérico TResult. Em seguida, usando o nome da classe TResult, o Parse método pode ser chamado. Com o seguinte snippet de código, alguns valores da sequência de teste são passados para análise e criação de um novo ColorField instância. Com a implementação do jogo, um algoritmo é chamado de obter os valores corretos da sequência com base no movimento e no tipo de jogo:

Outras implementações
Você pode estar interessado em como ISpanParsable é implementado para os tipos existentes. O seguinte snippet de código mostra a implementação para o IPAddress tipo. O TryParse método é usado para analisar um intervalo para um IPAddress instância. A implementação faz uso do IPAddressParser.Parse método. A implementação deste método verifica se um : está presente no intervalo e, nesse caso, o intervalo é analisado como um endereço IPv6. Caso contrário, o intervalo é analisado como um endereço IPv4. Se a análise falhar, a implementação verifica se o método com o prefixo Try é usado onde null é devolvido e, caso contrário, lança um FormatException. A implementação do método IP4StringToAddress para criar um tipo longo para representar o endereço IP que, por sua vez, é usado para instanciar uma instância do IPAddress é mostrado no seguinte snippet de código:

Como você pode ver na implementação de análise do IPAddress, o uso de código inseguro com os tipos C # e Span < T > pode ser útil. Com a implementação do ColorResult tipo em que os valores são gravados apenas em bytes diferentes, o uso de código inseguro não é necessário. Em casos como o IPAddress digite para converter o intervalo em um int, ele pode aumentar o desempenho, o que pode ser de grande vantagem quando você converte muitas instâncias no seu aplicativo.
Tirar
Criar uma implementação genérica para criar instâncias agora pode ser feito facilmente com o IParsable<T> e ISpanParsable<T> interfaces. Para o contrário, para converter um objeto em uma sequência ou extensão, use o IFormattable e ISpanFormattable interfaces. O ISpanFormattable interface está disponível desde .LÍQUIDA 6 e a IParsable e ISpanParsable interfaces estão disponíveis desde então .LÍQUIDA 7.