C# Language Controllo corretto degli argomenti

Esempio

Un metodo iteratore non viene eseguito fino a quando il valore di ritorno non viene enumerato. È quindi vantaggioso affermare le precondizioni al di fuori dell'iteratore.

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

Calling Side Code (Uso):

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

Produzione:

1
2
3
4
5
6
7
8
9
10

Live Demo su .NET Fiddle

Quando un metodo usa yield per generare un enumerabile, il compilatore crea una macchina a stati che, una volta iterata, eseguirà il codice fino a un yield . Quindi restituisce l'articolo restituito e salva il suo stato.

Ciò significa che non si scopriranno argomenti non validi (passaggio null ecc.) Quando si chiama il metodo per la prima volta (poiché ciò crea la macchina di stato), solo quando si tenta di accedere al primo elemento (perché solo allora il codice all'interno del il metodo viene eseguito dalla macchina di stato). Racchiudendolo in un metodo normale che prima controlla gli argomenti è possibile controllarli quando viene chiamato il metodo. Questo è un esempio di veloce fallimento.

Quando si utilizza C # 7+, la funzione CountCore può essere opportunamente nascosta nella funzione Count come funzione locale . Vedi l'esempio qui .