Estoy de acuerdo con la mayoría de las publicaciones aquí, que tienden hacia null
.
Mi razonamiento es que generar un objeto vacío con propiedades no anulables puede causar errores. Por ejemplo, una entidad con una int ID
propiedad tendría un valor inicial deID = 0
, que es un valor completamente válido. Si ese objeto, bajo alguna circunstancia, se guarda en la base de datos, sería algo malo.
Para cualquier cosa con un iterador, siempre usaría la colección vacía. Algo como
foreach (var eachValue in collection ?? new List<Type>(0))
es código olor en mi opinión. Las propiedades de la colección no deben ser nulas, nunca.
Un caso de borde es String
. Mucha gente dice String.IsNullOrEmpty
que no es realmente necesario, pero no siempre se puede distinguir entre una cadena vacía y una nula. Además, algunos sistemas de bases de datos (Oracle) no distinguen entre ellos ( ''
se almacenan como DBNULL
), por lo que se ve obligado a manejarlos por igual. La razón de esto es que la mayoría de los valores de cadena provienen de la entrada del usuario o de sistemas externos, mientras que ni los cuadros de texto ni la mayoría de los formatos de intercambio tienen representaciones diferentes para ''
y null
. Entonces, incluso si el usuario desea eliminar un valor, no puede hacer nada más que borrar el control de entrada. También la distinción de anulable y no anulablenvarchar
campos de bases de datos es más que cuestionable, si su DBMS no es oráculo, un campo obligatorio que permite''
es extraño, su IU nunca lo permitiría, por lo que sus restricciones no se asignan. Entonces la respuesta aquí, en mi opinión es, manejarlos por igual, siempre.
Con respecto a su pregunta con respecto a las excepciones y el rendimiento: si lanza una excepción que no puede manejar completamente en la lógica de su programa, debe cancelar, en algún momento, lo que sea que esté haciendo su programa, y pedirle al usuario que vuelva a hacer lo que acaba de hacer. En ese caso, la penalización de rendimiento de a catch
es realmente la menor de sus preocupaciones: tener que preguntar al usuario es el elefante en la sala (lo que significa volver a representar toda la interfaz de usuario o enviar algo de HTML a través de Internet). Por lo tanto, si no sigue el antipatrón de " Flujo de programa con excepciones ", no se moleste, simplemente tire uno si tiene sentido. Incluso en casos límite, como "Excepción de validación", el rendimiento realmente no es un problema, ya que debe preguntar al usuario nuevamente, en cualquier caso.
if (!DataExists)
.