BT

Disseminando conhecimento e inovação em desenvolvimento de software corporativo.

Contribuir

Tópicos

Escolha a região

Início Notícias Ficando por dentro do C# 7.1 e C# 7.2

Ficando por dentro do C# 7.1 e C# 7.2

Favoritos

Como parte do Visual Studio 15.3, a Microsoft ofereceu junto a atualização do C#, desde o .NET 1.1. O C# 7.1 fornece três novas funcionalidades, duas das quais funcionam.

Literais padrão no C# 7.1/C# 7.2

A ideia por trás das literais padrão é remover um pouco de código de referência (boilerplate code). Abaixo, um exemplo:

public Task GetOrderAsync(int orderKey, CancellationToken token = default(CancellationToken))

Isso é um pouco verboso, utilizando a palavra-chave Nothing do Visual Basic, podemos escrever assim:

public Task GetOrderAsync(int orderKey, CancellationToken token = default)

E funciona como o esperado. O problema começa quando temos de usar um tipo que aceita nulos (nullable).

public Task GetOrders(int? limit = default)

Isso deve limitar o parâmetro limit para null, mas no C# 7.1 isso retornará 0 (zero).

A correção para esse problema está agendada para o C# 7.2, que será lançada junto ao Visual Studio 15.5.

Nomes de tuplas inferidos no C# 7.1

Desde a introdução dos tipos anônimos, o C# tem permitido nomear propriedades implicitamente. Por exemplo, se escrevermos a linha abaixo, o objeto y terá as propriedades de nome A e B:

var y = new { x.A, x.B };

Com o C# 7.1, os valores das tuplas também ganham essa habilidade:

var z1 = (A: x.A, B: x.B); //explicit names
var z2 = (x.A, x.B); //inferred names

Confira nossa cobertura anterior sobre a inferência em nomes de tupla.

Async Main no C# 7.1

Não há muito o que dizer aqui. As funções Main agora podem ser assíncronas, o que remove um pouco de código de referência que antes deveria ser escrito.

Ref condicional no C# 7.2

O operador condicional no C# é geralmente referenciado como "o operador ternário" porque é o único na linguagem. Com o C# 7.2, teremos um segundo operador ternário chamado de operador condicional Ref.

Esta funcionalidade permitirá às expressões ref serem usadas em condicionais. Abaixo um exemplo:

ref var r = ref (arr != null ? ref arr[0]: ref otherArr[0]);

Repare que além de usar a palavra-chave “ref” junto aos dois possíveis resultados, também temos de incluir “ref” e parênteses sobre toda a expressão.

Separadores de prefixo no C# 7.2

Essa funcionalidade estende a habilidade de usar undescore em literais numéricos. A listagem seguinte é desta proposta:

123 // permitted in C# 1.0 and later

1_2_3 // permitted in C# 7.0 and later
0x1_2_3 // permitted in C# 7.0 and later
0b101 // binary literals added in C# 7.0
0b1_0_1 // permitted in C# 7.0 and later

// in C# 7.2, _ is permitted after the `0x` or `0b`
0x_1_2 // permitted in C# 7.2 and later
0b_1_0_1 // permitted in C# 7.2 and later

Argumentos nomeados não seguidos no C# 7.2

Argumentos nomeados servem dois propósitos no C#:

  • Permite pular parâmetros opcionais
  • Fornece clareza, especialmente para argumentos booleanos

Este recurso lida com o segundo. Como ilustrado:

void DoSomething(bool delayExecution, bool continueOnError, int maxRecords);
DoSomething(true, false, 100);

A não ser que saibamos as assinaturas das funções é difícil dizer de imediato o que true ou false significam. No passado você poderia escrever assim:

DoSomething(delayExecution: true, continueOnError: false, maxRecords: 100);

Mas parece estranho ter de especificar maxRecords quando não há dúvida sobre esse parâmetro. Sob a proposta dos Argumentos nomeados não seguidos, podemos especificar somente os argumentos que queremos:

DoSomething(delayExecution: true, continueOnError: false, 100);

Nota do Editor: Enums ainda são melhores que booleanos quando clarificação do código é uma preocupação.

Private Protected no C# 7.2

No C# há 5 níveis de acessibilidade: private, internal, protected, protected-or-internal, and public. Mas dentro do CLR existe um sexto nível de acessibilidade chamado FamANDAssem, "acessível por sub-tipos somente dentro deste assembly".

Trivia: No CLR, "protected" é chamado "family" e "internal" é chamado "assembly".

Com a nova palavra-chave "private protected", os desenvolvedores ganham a habilidade de usar o FamANDAssem do CLR. A proposta Private Protected explica porque isto é importante:

Há diversas circunstâncias nas quais uma API pode conter membros que são unicamente dedicados a serem implementados e usados por subclasses contidas no assembly que fornece o tipo. Apesar da CLR fornecer nível de acessibilidade com esse propósito, isso não está disponível no C#. Consequentemente os donos das API são forçados a usar uma proteção interna e auto-disciplinada ou um analisador customizado, ou usar protected com documentação adicional explicando isso, mesmo que os membros apareçam na documentação pública para o tipo, a intenção não é ser uma parte pública da API. Para exemplos desta última, veja membros que começam com o nome Common do CSharpCompilationOptions do Roslyn.

Referências Readonly no C# 7.2

Já falamos sobre as referências readonly antes, então não há nada de novo aqui. Essas referências são, essencialmente, uma forma de indicar que queremos os benefícios de performance ao passar struct por referência, mas não o recurso de modificar o valor.

Atualmente essa proposta de referências readonly está marcada como prototipada, mas não implementada.

Garantia do tempo de compilação de segurança para tipos ref [Proposta 7.2]

Esse recurso do C# também é conhecido como "ponteiro interior" ou "tipos ref". A proposta é permitir o compilador a requisitar que certos tipos como o Span<T> somente apareça na stack(pilha). Importante apenas para cenários de alta performance, a proposta de tipos ref não mudou desde as últimas informações sobre ele.

Recursos Excluídos

Essas funcionalidades não estão mais marcadas como parte da proposta da versão 7.2. Isso não significa que não serão desenvolvidas, mas provavelmente não aparecerão tão cedo.

Avalie esse artigo

Relevância
Estilo/Redação

Conteúdo educacional

BT