Novidades no C# 7.2What's new in C# 7.2

O C# 7.2 é outra versão de ponto que adiciona vários recursos úteis.C# 7.2 is another point release that adds a number of useful features. Um tema desta versão é o trabalho com maior eficiência com tipos de valor, evitando cópias ou alocações desnecessárias.One theme for this release is working more efficiently with value types by avoiding unnecessary copies or allocations.

Os recursos restantes são pequenos e agradáveis.The remaining features are small, nice-to-have features.

O C# 7.2 usa o elemento de configuração de seleção de versão de linguagem para selecionar a versão de linguagem do compilador.C# 7.2 uses the language version selection configuration element to select the compiler language version.

Os novos recursos de linguagem nesta versão são:The new language features in this release are:

O restante deste artigo fornece uma visão geral de cada recurso.The remainder of this article provides an overview of each feature. Para cada recurso, você aprenderá o raciocínio por trás dele.For each feature, you'll learn the reasoning behind it. Você aprenderá a sintaxe.You'll learn the syntax. Você pode explorar esses recursos em seu ambiente usando a ferramenta global dotnet try:You can explore these features in your environment using the dotnet try global tool:

  1. Instale a ferramenta global dotnet-try.Install the dotnet-try global tool.
  2. Clone o repositório dotnet/try-samples.Clone the dotnet/try-samples repository.
  3. Definir o diretório atual do subdiretório csharp7 para o repositório try-samples.Set the current directory to the csharp7 subdirectory for the try-samples repository.
  4. Execute dotnet try.Run dotnet try.

Aprimoramentos de código eficiente seguroSafe efficient code enhancements

Os recursos de linguagem introduzidos na 7.2 permitem trabalhar com tipos de valor ao usar semântica de referência.Language features introduced in 7.2 let you work with value types while using reference semantics. Eles são projetados para melhorar o desempenho, minimizando a cópia de tipos de valor sem incorrer nas alocações de memória associadas ao uso de tipos de referência.They are designed to increase performance by minimizing copying value types without incurring the memory allocations associated with using reference types. Os recursos incluem:The features include:

  • O modificador in em parâmetros, para especificar que um argumento é passado por referência, mas não modificado pelo método chamado.The in modifier on parameters, to specify that an argument is passed by reference but not modified by the called method. Adicionar o modificador in a um argumento é uma alteração compatível com a origem.Adding the in modifier to an argument is a source compatible change.
  • O modificador ref readonly nos retornos de método, para indicar que um método retorna seu valor por referência, mas não permite gravações nesse objeto.The ref readonly modifier on method returns, to indicate that a method returns its value by reference but doesn't allow writes to that object. Adicionar o modificador ref readonly é uma alteração compatível com a origem se o retorno é atribuído a um valor.Adding the ref readonly modifier is a source compatible change, if the return is assigned to a value. Adicionar o modificador readonly a uma instrução de retorno ref existente é uma alteração incompatível.Adding the readonly modifier to an existing ref return statement is an incompatible change. Ela requer que os chamadores atualizem a declaração de ref variáveis locais para incluir o modificador readonly.It requires callers to update the declaration of ref local variables to include the readonly modifier.
  • A declaração readonly struct, para indicar que uma struct é imutável e deve ser passado como um parâmetro in para seus métodos de membro.The readonly struct declaration, to indicate that a struct is immutable and should be passed as an in parameter to its member methods. Adicionar o modificador readonly a uma declaração struct existente é uma alteração compatível com binário.Adding the readonly modifier to an existing struct declaration is a binary compatible change.
  • A declaração ref struct, para indicar que um tipo de struct acessa a memória gerenciada diretamente e deve sempre ser alocado por pilha.The ref struct declaration, to indicate that a struct type accesses managed memory directly and must always be stack allocated. Adicionar o modificador ref a uma declaração struct existente é uma alteração incompatível.Adding the ref modifier to an existing struct declaration is an incompatible change. Um ref struct não pode ser um membro de uma classe ou usado em outros locais em que ele pode ser alocado no heap.A ref struct cannot be a member of a class or used in other locations where it may be allocated on the heap.

Você pode ler mais sobre todas essas alterações em Escrever código eficiente seguro.You can read more about all these changes in Write safe efficient code.

Argumentos nomeados que não estejam à direitaNon-trailing named arguments

Agora as chamadas de método podem usar argumentos nomeados que precedem argumentos posicionais quando esses argumentos nomeados estão nas posições corretas.Method calls may now use named arguments that precede positional arguments when those named arguments are in the correct positions. Para obter mais informações, consulte Argumentos nomeados e opcionais.For more information see Named and optional arguments.

Sublinhados à esquerda em literais numéricosLeading underscores in numeric literals

A implementação de suporte para separadores de dígitos no C# 7.0 não permite que o _ esteja no primeiro caractere do valor literal.The implementation of support for digit separators in C# 7.0 didn't allow the _ to be the first character of the literal value. Agora os literais numéricos binários e hexadecimais podem começar com um _.Hex and binary numeric literals may now begin with an _.

Por exemplo:For example:

int binaryValue = 0b_0101_0101;

modificador de acesso protegido privadoprivate protected access modifier

Um novo modificador de acesso composto: private protected indica que um membro pode ser acessado pela classe que o contém ou por classes derivadas que são declaradas no mesmo assembly.A new compound access modifier: private protected indicates that a member may be accessed by containing class or derived classes that are declared in the same assembly. Enquanto que protected internal permite o acesso por classes derivadas ou classes que estejam no mesmo assembly, o private protected limita o acesso a tipos derivados declarados no mesmo assembly.While protected internal allows access by derived classes or classes that are in the same assembly, private protected limits access to derived types declared in the same assembly.

Para obter mais informações, consulte modificadores de acesso na referência de linguagem.For more information see access modifiers in the language reference.

Expressões ref condicionaisConditional ref expressions

Por fim, a expressão condicional pode produzir um resultado ref em vez de um resultado de valor.Finally, the conditional expression may produce a ref result instead of a value result. Por exemplo, você gravaria o seguinte para recuperar uma referência ao primeiro elemento em uma de duas matrizes:For example, you would write the following to retrieve a reference to the first element in one of two arrays:

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

A variável r é uma referência ao primeiro valor em arr ou otherArr.The variable r is a reference to the first value in either arr or otherArr.

Para saber mais, confira Operador condicional (?:) na referência da linguagem.For more information, see conditional operator (?:) in the language reference.