Binary Literals, Digit Separators e Throw Expressions no C# 7.0

Dando continuidade à série de artigos sobre novidades do C# 7, hoje conheceremos três novos recursos que melhoram a legibilidade e reduzem o número de linhas de código:

  • Binary Literals;
  • Digit Separators;
  • Throw Expressions.

Binary Literals

Este recurso seria adicionado no C# 6.0 mas, no final, foi decidido que só entraria na versão 7. Como o nome indica, ele permite declarar valores binários como literais.

Para fazer isso, basta utilizar o prefixo 0b:

byte var1 = 0b00011011;
byte var2 = 0b10101010;
ushort var3 = 0b111001011010000;
Console.WriteLine($"{var1:X}");
Console.WriteLine($"{var2:X}");
Console.WriteLine($"{var3:X}");

Ele torna mais simples trabalhar com valores binários no código. Mesmo não sendo algo muito comum, agora não é mais necessário trabalhar com as versões em decimais dos valores binários. O que melhora a legibilidade do código.

Digit Separators

Ainda no quesito de melhorar a legibilidade, agora na versão 7, o C# permite que se utilize o underline (_) como digito separador de um valor numérico literal.

No lugar de definir um valor assim:

int var1 = 1234567891011;

Ele pode ser definido da seguinte forma:

int var1 = 1_234_567_891_011;

Isso também pode ser aplicado a valores binários:

ushort var1 = 0b0001_1011_1100_0001;

Ou hexadecimais:

ulong l2 = 0xfedc_ba98_7654_3210;

E o digito separador tem importância apenas visual, portanto, ele pode ser definido de qualquer forma no valor que será interpretado da mesma forma pelo C#:

int var1 = 1_2345_6789_1011;
ushort var1 = 0b000_110_111_100_000_1;
ulong l2 = 0xfe_dc_ba_98_76_54_32_10;

Throw Expressions

Por fim, temos um recurso chamado throw expressions, que permite reduzir a quantidade de linhas do código.

Até a versão 6, quando era necessário gerar uma exceção a partir do valor de um retorno, era necessário realizar o procedimento abaixo:

public class Pessoa
{
    private int _idade;
 
    public int Idade
    {
        get
        {
            return _idade;
        }
        set
        {
            if (value > 0)
                _idade = value;
            else
                throw new Exception("Idade inválida!");
        }
    }
}

Como a cláusula throw não podia ser utilizada em expressões que retornam valores, o seu uso em situações acima, estava atrelado a uma condicional. Mas, na versão 7.0, com o recurso throw expression, é possível lançar exceções a partir do código que define uma expressão. Assim, o mesmo código acima pode ser refeito para:

public class Pessoa
{
    private int _idade;
 
    public int Idade
    {
        get
        {
            return _idade;
        }
        set
        {
            _idade = value > 0 ? value : throw new Exception("Idade inválida!");
        }
    }
}

Teremos o mesmo resultado do código anterior.

Este recurso pode ser combinado com o recurso Expression-bodied Members, para gerar um resultado ainda mais enxuto:

public class Pessoa
{
    private int _idade;
 
    public int Idade
    {
        get => _idade;
        set => _idade = value > 0 ? value : throw new Exception("Idade inválida!");
    }
}

Conclusão

Apesar de serem recursos que modificam pequenos detalhes da linguagem, seus usos são recomendados pois melhoram a qualidade do código. Então, sempre que possível procure utilizá-los.

Deixe seu comentário

Instrutor, nerd, cinéfilo e desenvolvedor nas horas vagas. Graduado em Ciências da Computação pela Universidade Metodista de São Paulo.

JUNTE-SE A MAIS DE 150.000 PROGRAMADORES