Validazione degli argomenti e yield return con C# 7
La validazione degli argomenti nei metodi che utilizzano il costrutto "yield return" è un tema che abbiamo già affrontato in questo blog. Tuttavia oggi C# 7 e VS2017 ci permettono di migliorare quell'approccio e rendere il nostro codice ancora più sicuro.
Ricordiamoci che per effettuare la validazione in un metodo che utilizza lo "yield return" è necessario spezzarlo in due parti:
- una che implementa le funzionalità "MethodImpl"
- una che effettua la validazione e chiama l'altra "Method"
Il metodo "MethodImpl" che implementa la funzionalità sarà per ovvie ragioni privato ma questo non impedisce ad altro codice di chiamarlo senza eseguire prima la validazione necessaria. Se "MethodImpl" viene utilizzato solo in "Method" possiamo usare C# 7 per migliorare l'affidabilità del codice. In particolare la feature delle "local functions" permette di definire delle funzioni all'interno di altre funzioni e di limitarne quindi la visibilità rispetto ad altro codice. In questo modo possiamo nascondere il metodo "interno" che esegue effettivamente il codice, in questo modo il metodo esaminato nel post citato all'inizio diventa
static IEnumerable<char> AllCharacters(string str) { if (str == null) throw new ArgumentNullException(nameof(str)); return AllCharactersImpl(str); IEnumerable<char> AllCharactersImpl(string s) { foreach (var item in s) { yield return item; } } }
Il legame tra i due metodi è chiaro e non dipende da una nomenclatura specifica, ad esempio il suffisso "Impl" e nessuno al di fuori del metodo "AllCharacters" può chiamare la sua implementazione