Атрибут, указывающий, что результат не равен нулю, когда параметр имеет значение true?

У меня есть что-то вроде следующего метода.

public Node? GetLastNode(bool createNewIfEmpty = false)
{
    // Return last node if any
    if (Nodes.Count > 0)
        return Nodes[Nodes.Count - 1];

    // Return a new appended node, if requested
    if (createNewIfEmpty)
    {
        Nodes.Add(new Node());
        return Nodes[0];
    }

    // Otherwise, return null
    return null;
}

При включенных ссылочных типах, допускающих значение NULL, есть ли какой-либо атрибут (или другой способ), чтобы указать, что этот метод никогда не возвращает значение null, пока параметр createNewIfEmpty равен true?


person Jonathan Wood    schedule 20.02.2021    source источник
comment
Вы можете использовать Nodes[^1] для поиска последнего члена массива вместо Nodes[Nodes.Count - 1]   -  person Amirhossein Azhdari    schedule 20.02.2021
comment
Все еще не отвечая на ваш вопрос, но рассмотрите Nodes.Any() вместо Nodes.Count > 0   -  person Flydog57    schedule 20.02.2021
comment
@Flydog57: Почему? Вы смотрели на реализацию Nodes.Any() и есть основания полагать, что она более производительна?   -  person Jonathan Wood    schedule 20.02.2021
comment
NotNullIfNotNull атрибут кажется наиболее близким к вашей цели, но не принимает значение bool   -  person Pavel Anikhouski    schedule 20.02.2021
comment
@PavelAnikhouski: Верно   -  person Jonathan Wood    schedule 20.02.2021
comment
@JonathanWood: взгляните на комментарии Эрика Липперта к ответу на этот вопрос: stackoverflow.com/questions/59571105/. Да, список против массива, но все же...   -  person Flydog57    schedule 20.02.2021
comment
@Flydog57: В моем примере Nodes представляет собой список и может очень быстро дать вам количество элементов с помощью свойства Count, так что это действительно вопрос вкуса. Но я бы также поставил 100 долларов, что мой путь будет быстрее.   -  person Jonathan Wood    schedule 20.02.2021


Ответы (1)


Я не уверен, что NotNullIfNotNull может решить это за вас, но альтернативой было бы разделение метода на две части, если только у вас нет жесткого требования управлять им из аргумента:

public Node? GetLastNode()
{
    // Return last node if any. Otherwise, return null
    return Nodes.Count > 0
        ? Nodes[^1]
        : null;
}

public Node GetOrCreateLastNode()
{
    // Add new node if the list is empty
    if (Nodes.Count == 0)
        Nodes.Add(new Node());

    // Return the last node
    return Nodes[^1];
}
person Xerillio    schedule 20.02.2021