Esse é o 3º post da série sobre C# 7. Pra acompanhar a série você pode seguir a tag C#7 no blog ou voltar no post que agrega a série.

Nesse post vou falar de binary literals, ou literais de binários, que nada mais são do que literais de inteiros que podem ser descritos como binários. E vou falar também de digit separators, que permitem separar números com “_”. Essas são mais duas funcionalidades que ajudam a deixar o código mais expressivo, e que são relacionadas, já que se referem a literais numéricos.

Ambas funcionalidades estão bem estáveis no momento, já no branch “future” do Roslyn, e é praticamente certo de que vão entrar no C# 7, o time já está finalizando os trabalhos, e praticamente não há bugs.

Você pode ler o issue no github que sugere binary literals no repositório do Roslyn, é o issue chamado “Proposal: Binary literals”, e a funcionalidade é acompanhada por uma tag chamada “New Language Feature – Binary Literals” que agrega sugestões em volta da proposta principal. Já para digit separators há o issue “Proposal: Digit separators”, que está agregada na mesma tag.

Binary Literals

Literais de binário te permitem escrever um inteiro informando os binários que compõe esse inteiro (0 e 1). Basta iniciar o inteiro com “0b” ou “0B”, e ele é considerado um literal binário. Assim, isso, temos:

  • 0b0 é zero;
  • 0b1 é um;
  • 0b10 são dois;
  • 0b11 são três;
  • 0b100 são quatro…

E por aí vai.

O inteiro também poderá ser seguido de uma letra que informa se é um inteiro sem sinal (u ou U), um long (l ou L), ou ambos em qualquer casing ou ordem (por exemplo, UL), nesse caso um longo sem sinal. Assim, o número um com tipo long sem sinal binário seria “0b1UL”.

Usa-se um literal binário em qualquer lugar em que um literal decimal seria usado, ou seja, para inicializar uma variável, como argumento a uma função, etc.

Qualquer semelhança com números hexa não são mera conhecidência, com a única diferença que os hexa começam com “0x” e são chatos pra contar.

Digit Separators

Os separadores de digitos permitem usar o underscore (a.k.a. underline, ou “_”) para separar qualquer número (não somente literais binários). São especialmente interessantes em números que quando escritos ficam extensos, por isso aparecem junto da feature de binary literals, já que números binários podem ficar bem grandes (em quantidade de caracteres).

Assim, todos esses números são o número mil e vinte e quatro:

  • 1_024
  • 0b10_000_000_000
  • 0b100_0000_0000
  • 0x4_00

O underscore somente não poderá aparecer na frente de um ponto (10_.0), de um caractere exponencial (1.1e_1), do caractere de especificação de tipo (10_L), seguindo os caracteres de binário (0b_1) ou de hexa (0x_1). Mas em outras posições é ok, por exemplo, antes do ponto (10_0.0) ou depois (10.0_1), sem encostar no ponto.

Resumindo

Duas pequenas features, ambas bem vindas.

Curtiram? Comentem nos comentários.

E temos tido boas conversas no Brasil.NET, vem conversar com a gente na sala de C# lá (se ainda não entrou, ou link pra entrar é esse: http://brasildotnet.azurewebsites.net/).