Looking for c# Keywords? Try Ask4Keywords

C# Language Правильно проверяющие аргументы


пример

Метод итератора не выполняется до тех пор, пока не будет перечислено возвращаемое значение. Поэтому выгодно утверждать предпосылки за пределами итератора.

public static IEnumerable<int> Count(int start, int count)
{
    // The exception will throw when the method is called, not when the result is iterated
    if (count < 0)
        throw new ArgumentOutOfRangeException(nameof(count));

    return CountCore(start, count);
}

private static IEnumerable<int> CountCore(int start, int count)
{
    // If the exception was thrown here it would be raised during the first MoveNext()
    // call on the IEnumerator, potentially at a point in the code far away from where
    // an incorrect value was passed.
    for (int i = 0; i < count; i++)
    {
        yield return start + i;
    }
}

Вызов бокового кода (использование):

// Get the count
var count = Count(1,10);
// Iterate the results
foreach(var x in count)
{
    Console.WriteLine(x);
}

Выход:

1
2
3
4
5
6
7
8
9
10

Живая демонстрация на .NET скрипке

Когда метод использует yield для генерации перечислимого, компилятор создает конечный автомат, который при повторном запуске будет работать с кодом до yield . Затем он возвращает полученный элемент и сохраняет его состояние.

Это означает, что вы не узнаете о недопустимых аргументах (передаете null и т. Д.) При первом вызове метода (поскольку это создает конечный автомат), только когда вы пытаетесь получить доступ к первому элементу (потому что только тогда код внутри метод get запускается конечным автоматом). Обернув его обычным методом, который сначала проверяет аргументы, вы можете проверить их при вызове метода. Это пример неудачи.

При использовании C # 7+ функция CountCore может быть удобно скрыта в функции Count как локальная функция . См. Пример здесь .