C# Language Evita riferimenti null

Esempio

Gli sviluppatori C # ottengono un sacco di eccezioni di riferimento null da gestire. Gli sviluppatori di F # non lo fanno perché hanno il tipo Option. Un tipo di opzione <> (alcuni preferiscono forse <> come nome) fornisce un tipo di ritorno Some e None. Rende esplicito che un metodo potrebbe essere in procinto di restituire un record nullo.

Ad esempio, non puoi leggere quanto segue e sapere se dovrai gestire un valore nullo.

var user = _repository.GetUser(id);

Se si conosce l'eventuale null, è possibile introdurre un codice di codice per affrontarlo.

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

Cosa succede se invece è stata restituita un'opzione <>?

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

Il codice ora rende esplicito che potremmo avere un record None restituito e il codice boilerplate da verificare per Some o None è richiesto:

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

Il seguente metodo mostra come restituire un'opzione <>

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>();
}

Ecco un'implementazione minima dell'opzione <>.

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);
    }
}

Per dimostrare quanto sopra avoidNull.csx può essere eseguito con C # REPL.

Come affermato, questa è un'implementazione minima. Una ricerca di pacchetti "Forse" NuGet mostrerà un buon numero di buone librerie.