C# Language Éviter les références nulles

Exemple

Les développeurs C # ont beaucoup d'exceptions de référence à traiter. Les développeurs F # ne le font pas car ils ont le type Option. Un type Option <> (certains préfèrent peut-être <> comme nom) fournit un type de retour Some et a None. Il est explicite qu'une méthode est sur le point de retourner un enregistrement nul.

Par exemple, vous ne pouvez pas lire ce qui suit et savoir si vous devrez gérer une valeur nulle.

var user = _repository.GetUser(id);

Si vous connaissez le possible null, vous pouvez introduire un code standard pour le gérer.

var username = user != null ? user.Name : string.Empty;

Que se passe-t-il si une option <> est retournée à la place?

Option<User> maybeUser = _repository.GetUser(id);

Le code rend maintenant explicite le fait que nous pouvons avoir un enregistrement None et le code passe-partout pour vérifier certains ou aucun est requis:

var username = maybeUser.HasValue ? maybeUser.Value.Name : string.Empty;

La méthode suivante montre comment retourner une option <>

public Option<User> GetUser(int id)
{
    var users = new List<User>
    {
        new User { Id = 1, Name = "Joe Bloggs" },
        new User { Id = 2, Name = "John Smith" }
    };

    var user = users.FirstOrDefault(user => user.Id == id);

    return user != null ? new Option<User>(user) : new Option<User>();
}

Voici une implémentation minimale d'Option <>.

public struct Option<T>
{
    private readonly T _value;

    public T Value
    {
        get
        {
            if (!HasValue)
                throw new InvalidOperationException();

            return _value;
        }
    }

    public bool HasValue
    {
        get { return _value != null; }
    }

    public Option(T value)
    {
        _value = value;
    }

    public static implicit operator Option<T>(T value)
    {
        return new Option<T>(value);
    }
}

Pour démontrer ce qui précède, AvoidNull.csx peut être exécuté avec le C # REPL.

Comme indiqué, il s'agit d'une implémentation minimale. Une recherche de paquets "Maybe" NuGet permettra de créer un certain nombre de bonnes bibliothèques.