Sono d'accordo con la maggior parte dei post qui, che tendono verso null
.
Il mio ragionamento è che la generazione di un oggetto vuoto con proprietà non annullabili può causare bug. Ad esempio, un'entità con una int ID
proprietà avrebbe un valore iniziale di ID = 0
, che è un valore completamente valido. Se quell'oggetto, in qualche circostanza, venisse salvato nel database, sarebbe una brutta cosa.
Per qualsiasi cosa con un iteratore userei sempre la raccolta vuota. Qualcosa di simile a
foreach (var eachValue in collection ?? new List<Type>(0))
è odore di codice secondo me. Le proprietà della raccolta non dovrebbero mai essere nulle.
Un caso limite è String
. Molte persone dicono, String.IsNullOrEmpty
non è davvero necessario, ma non è sempre possibile distinguere tra una stringa vuota e nulla. Inoltre, alcuni sistemi di database (Oracle) non li distinguono affatto ( ''
vengono archiviati come DBNULL
), quindi sei costretto a gestirli equamente. Il motivo è che la maggior parte dei valori di stringa provengono dall'input dell'utente o da sistemi esterni, mentre né le caselle di testo né la maggior parte dei formati di scambio hanno rappresentazioni diverse per ''
e null
. Pertanto, anche se l'utente desidera rimuovere un valore, non può fare altro che cancellare il controllo di input. Anche la distinzione tra nullable e non nullablenvarchar
campi di database è più che discutibile, se il tuo DBMS non è un oracolo - un campo obbligatorio che consente''
è strano, la tua UI non lo permetterebbe mai, quindi i tuoi vincoli non vengono mappati. Quindi la risposta qui, a mio avviso, è gestirli equamente, sempre.
Per quanto riguarda la domanda relativa alle eccezioni e alle prestazioni: se si genera un'eccezione che non è possibile gestire completamente nella logica del programma, è necessario interrompere, a un certo punto, qualunque cosa il programma stia facendo e chiedere all'utente di ripetere tutto ciò che ha appena fatto. In tal caso, la penalità prestazionale di a catch
è davvero l'ultima delle tue preoccupazioni: dover chiedere all'utente è l'elefante nella stanza (il che significa ridistribuire l'intera interfaccia utente o inviare un codice HTML attraverso Internet). Quindi, se non segui l'anti-schema di " Flusso del programma con eccezioni ", non preoccuparti, lanciane uno se ha senso. Anche in casi limite, come "Eccezione di convalida", le prestazioni non sono in realtà un problema, poiché in ogni caso è necessario chiedere nuovamente all'utente.
if (!DataExists)
.