');

C# Language Vermeiden Sie Nullreferenzen

Beispiel

C # -Entwickler erhalten eine Menge von Nullreferenzausnahmen. F # -Entwickler tun dies nicht, weil sie den Option-Typ haben. Ein Option <> -Typ (einige bevorzugen vielleicht <> als Namen) enthalten den Rückgabetyp Some und None. Es macht explizit deutlich, dass eine Methode im Begriff ist, einen Null-Datensatz zurückzugeben.

Beispielsweise können Sie Folgendes nicht lesen und wissen, ob Sie mit einem Nullwert arbeiten müssen.

var user = _repository.GetUser(id);

Wenn Sie die mögliche Null kennen, können Sie einen Boilerplate-Code einführen, um damit umzugehen.

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

Was ist, wenn wir stattdessen eine Option <> zurückgegeben haben?

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

Der Code macht jetzt explizit deutlich, dass möglicherweise ein None-Datensatz zurückgegeben wird, und der Code für die Plattenspeicherung, der auf Some oder None überprüft werden muss:

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

Die folgende Methode zeigt, wie eine Option <> zurückgegeben wird

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

Hier ist eine minimale Implementierung von 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);
    }
}

Zur Veranschaulichung der obigen Vermeidung kann Null.csx mit C # REPL ausgeführt werden.

Wie gesagt, ist dies eine minimale Implementierung. Bei der Suche nach "Vielleicht" NuGet-Paketen werden eine Reihe guter Bibliotheken angezeigt.