C# -  O que há de novo com o C# 9.0 ?


Neste artigo vamos fazer uma prévia de alguns recursos que estão previstos para a versão 9.0 da linguagem C#.

Antes mesmo do lançamento da versão 8.0 da linguagem C#, já existia um planejamento de novos recursos previstos para a versão 9.0. Isso sempre funciona dessa forma.

Se você quiser se manter atualizado sobre como anda a implementação de novas funcionalidades para a linguagem basta acompanhar as listas de discussões.

Então o que irei mostrar a seguir esta baseado nestas listas lembrando que até o lançamento oficial da versão as coisas podem ser alteradas.

Vejamos agora os novos recursos esperados (previsão):

1. Código de validação de parâmetro NULL simplificado

A versão simplificada prega que : decorando o valor de um parâmetro para um método com uma pequena anotação, simplificamos a lógica interna, não necessitando de cláusulas de validação, reduzindo assim o código de validação padrão.

// Antes
void Insert(string s) {
 if (s is null) {
   throw new ArgumentNullException(nameof(s));
 }
 ...
}
// proposta
void Insert(string s!) {
  ...
}

2. Expressão switch como uma expressão de instrução

Este recurso ainda está na fase de discussão, mas a idéia geral é permitir uma expressão switch como uma declaração de expressão. Por exemplo:

//proposta
private void M (bool c, ref int x, ref string s)
{
   c switch {true => x = 1, false => s = null};
}
ou
private void M (bool c, ref int x, ref string s) => c switch {true => x = 1, false => s = null};

3. Construtores Primários

Neste recurso o objetivo é simplificar todos os construtores, campos, getters/setters de propriedades, etc., com os quais estamos acostumados. Por exemplo:

// Atualmente:
class Pessoa
{
    private string _nome;
    public Pessoa(string nome)
    {
        _nome = nome;
    }
    public string Nome
    {
        get => _nome;
        set {
          if (value == null) {
              throw new NullArgumentException(nameof(Nome)); 
          }
          _nome = value;
        }
    }
}
//Proposta:
class Pessoa(string nome)
{
    public string Nome
    {
        get => nome;
        set {
          if (value == null){
            throw new NullArgumentException(nameof(Nome));
          }
          nome = value;
        }
    }
}

 

4. Record (Registro)

O objetivo da proposta para este recurso é remover a necessidade de escrever todo o código padrão quando criamos uma nova classe/estrutura.

//Partindo deste código
public class Pessoa
{
  public string Nome { get; }
  public DateTime Nascimento { get; }
  public Pessoa(string Nome, DateTime Nascimento)
  {
    this.Nome = Nome;
    this.Nascimento = Nascimento;
  }
}
//para algo assim(proposta):
public class Pessoa(string Nome, DateTime Nascimento);

 

5. Uniões Discriminadas / classe enum

Neste recurso a proposta é  usar palavras-chave com as quais estamos acostumados, combiná-las e adicioná-las as do Record (mencionado acima). Seria uma forma mais 'limpa' de criar classes base abstratas e tipos concretos que herdam delas. Exemplo:

// De algo como iso:
public partial abstract class Shape { }
public class Rectangle : Shape {
  public float Width { get; }
  public float Length { get; }
  public Rectangle(float Width, float Length){
    this.Width = Width;
    this.Length = Length;
  }
}
public class Circle : Shape {
  public float Radius { get; }
  public Circle(float Radius)
  {
    this.Radius = Radius;
  }
}
// Para algo como isto(proposta):
enum class Shape
{
  Rectangle(float Width, float Length);
  Circle(float Radius);
}

Estes cinco recursos, que ainda são propostas, são apenas um aperitivo diante de todo o conteúdo previsto para a versão 9.0 do C#.

Você pode acompanhar a discução no GitHub,  e pode participar dando opiniões e fazendo contribuições com algo que seja importante.

E estamos conversados...

"Eu sou o Alfa e o Ômega, o princípio e o fim, diz o Senhor, que é, e que era, e que há de vir, o Todo-Poderoso."
Apocalipse 1:8
 

Referências:


José Carlos Macoratti