Looking for c# Keywords? Try Ask4Keywords

C# Language Избегайте ссылок на Null


пример

Разработчики C # получают множество нулевых ссылочных исключений. Разработчики F # не потому, что у них есть тип Option. Тип Option <> (некоторые предпочитают, возможно, <> как имя), предоставляет тип возврата Some и a None. Он делает явным, что метод может возвращать нулевую запись.

Например, вы не можете прочитать следующее и знать, если вам придется иметь дело с нулевым значением.

var user = _repository.GetUser(id);

Если вы знаете о возможном нуле, вы можете ввести код шаблона, чтобы справиться с ним.

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

Что делать, если вместо этого есть опция <>?

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

Теперь код делает явным, что у нас может быть запись «Нет», и требуется шаблонный код для проверки Some или None:

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

Следующий метод показывает, как вернуть параметр <>

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

Ниже приведена минимальная реализация 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);
    }
}

Чтобы продемонстрировать вышеописанное, избегайте Null.csx с C # REPL.

Как было сказано, это минимальная реализация. Поиск пакетов «Возможно» NuGet приведет к появлению ряда хороших библиотек.