Novidades do C# 6.0 – Operador condicional nulo

No post anterior comentei sobre uma das novidades do C# 6.0, a interpolação de strings.

Agora neste post vou comentar sobre o operador condicional nulo, que particularmente, dentre as novidades, foi a que mais me agradou.

Com certeza você já teve ter passado por uma situação na qual precisasse testar se determinado objeto é nulo para então acessar uma propriedade ou método. Pois se acessarmos uma propriedade ou método de um objeto nulo ocorrerá uma exceção de referência nula.

Para exemplificar, vamos supor que eu possua uma classe Ponto com as propriedades X e Y. E esta mesma classe possua um método estático para instanciar um objeto do tipo Ponto a partir de um objeto Json, conforme código abaixo:

class Ponto
{
    public int X { get; set; }

    public int Y { get; set; }

    public static Ponto FromJson(JObject json)
    {
        if (json != null &&
            json["X"] != null &&
            json["X"].Type == JTokenType.Integer &&
            json["Y"] != null &&
            json["y"].Type == JTokenType.Integer)
        {
            return new Ponto() { X = (int)json["X"], Y = (int)json["Y"] };
        }

        return null;
    }
}

Agora, para simplificar este código vamos utilizar o operador condicional nulo, e vamos reescrever novamente a classe:

class Ponto
{
    public int X { get; set; }

    public int Y { get; set; }

    public static Ponto FromJson(JObject json)
    {
        if (json != null &&
            json["X"]?.Type == JTokenType.Integer &&
            json["Y"]?.Type == JTokenType.Integer)
        {
            return new Ponto() { X = (int)json["X"], Y = (int)json["Y"] };
        }

        return null;
    }
}

Perceba que foi utilizado o caractere ? no código fonte. Isto significa que a propriedade Type somente será acessada se o objeto for diferente de nulo, evitando que ocorra uma exceção. Ainda podemos diminuir mais um pouco o código:

class Ponto
{
    public int X { get; set; }

    public int Y { get; set; }

    public static Ponto FromJson(JObject json)
    {
        if (json?["X"]?.Type == JTokenType.Integer &&
            json?["Y"]?.Type == JTokenType.Integer)
        {
            return new Ponto() { X = (int)json["X"], Y = (int)json["Y"] };
        }

        return null;
    }
}

Agora ele somente acessará o “X” e o “Y” se o objeto json recebido por parâmetro não for nulo.

Outro uso que podemos dar para este operador é para quando estamos trabalhando com eventos. Se você já trabalhou com eventos provavelmente já deve ter escrito o seguinte trecho de código:

if (OnChanged != null)
{
    OnChanged(this, args);
}

Utilizando o operador condicional nulo, podemos reescrever este mesmo código da seguinte forma:

OnChanged?.Invoke(this, args);

O uso deste operador, quando bem utilizado, pode evitar vários erros de referência, além de reduzir o código fonte.

Para quem tiver interesse em conhecer todas as novidades do C# 6.0 acesse o link.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *