Sicuramente B, sarebbe una violazione del principio di singola responsabilità fare A poiché non è proprio questo lo scopo blocco di codice.
la mia preferenza personale è solo per fare una convalida come quella, comunque sui metodi di confine; come endpoint del servizio web o fascia API generale di una certa natura, dopo di che trovo la manutenibilità migliorata quando il codice consente un uso improprio causa solo un errore naturale (dereferenziazione per esempio nel tuo caso), in questo modo quando ciò che precedentemente era input non valido diventa input valido, c'è meno codice zangola. Inoltre, verrà generata un'eccezione se la usi, quindi perché preoccuparti di lanciare la tua eccezione?
Questa preferenza di evitare spesso le dichiarazioni di guardia è mia e mia, prendila con un pizzico di sale e solo per dire che dovresti analizzare te stesso i tuoi scenari per vedere cosa ha più senso per te, non sempre usa le istruzioni di guardia solo perché "best practice"
Detto questo, per questo caso particolare tendo a sfruttare l'operatore null coalesce; se voglio fare qualcosa con una collezione che ritengo possa essere nulla per qualche ragione, mi occuperò invece di (thatCollection ?? new List<T>())
al posto di essa, quindi finirai per trattare un elenco nullo come una lista vuota come parte del tuo le funzioni contraggono piuttosto che interferire con oggetti di qualcun altro che non sono di tua responsabilità. Questo è valido solo se non si aggiungono elementi alla collezione.
Prendo l'approccio che faccio solo per essere robusto in quanto evita il churn futuro, anche se mi accerto che sia valido comportamento entro i requisiti funzionali prima di prendere quell'approccio (lo è spesso). Ricorda:
Be conservative in what you send, be liberal in what you accept