Шаблон TryGetValue с обнуляемыми ссылочными типами C # 8 - PullRequest
3 голосов
/ 05 апреля 2019

Я играю с портированием некоторого кода на C #, чтобы включить обнуляемые ссылочные типы, и я столкнулся с некоторыми функциями в нашем коде, которые используют шаблон TryGetValue.

То есть как то так:

public bool TryGetSession(string key, out Session session) {
    session = null; // assign default
    // code which looks for a session based on the key, etc
    // return true or false if we found the session key
}

Шаблон, который мы здесь пытаемся выразить, таков: «если возвращаемое значение истинно, то session не равно нулю. Если ложно, то даже не пытайтесь посмотреть на сеанс, это мусор.

Проблема в том, что теперь я получаю предупреждение о session = null, но я вынужден поместить туда что-то , так как out параметры ДОЛЖНЫ быть заполнены функцией.

Здесь есть хороший ответ? Мои мысли:

Я мог бы отбросить шаблон TryGet и включить обнуляемые ссылочные типы (это то, что делают другие языки, такие как Swift), например.

Session? GetSession(string key);

Или я мог бы выполнить свое «ненулевое» обещание, используя значение заполнителя, например,

public bool TryGetSession(string key, out Session session) {
    session = new InvalidSession(); // assign default
    ...
}

Есть ли другие варианты?

1 Ответ

1 голос
/ 05 апреля 2019

Я закончил с быстрым стилем Session? GetSession()

Нулевая безопасность означает, что попытка просто пойти и использовать сеанс без проверки на нуль выдает предупреждение, поэтому вы не можете случайно использовать значение, когда оно равно нулю. Это то же самое, что TryGet пытался достичь, поэтому я доволен этим.

Пример

var session = GetSession();
if(session == null)
    return;

// now go and use session. Flow analysis knows that it's not null

Альтернатива, которая меньше строк, но больше пунктуации:

if(!(GetSession() is Session session))
    return;

// now go and use session. Flow analysis knows that it's not null
...