Eu concordo com a maioria das postagens aqui, que tendem para null
.
Meu raciocínio é que a geração de um objeto vazio com propriedades não anuláveis pode causar erros. Por exemplo, uma entidade com uma int ID
propriedade teria um valor inicial de ID = 0
, que é um valor totalmente válido. Se esse objeto, sob alguma circunstância, for salvo no banco de dados, seria uma coisa ruim.
Para qualquer coisa com um iterador, eu sempre usaria a coleção vazia. Algo como
foreach (var eachValue in collection ?? new List<Type>(0))
é o cheiro do código na minha opinião. As propriedades da coleção nunca devem ser nulas.
Um caso de ponta é String
. Muitas pessoas dizem que isso String.IsNullOrEmpty
não é realmente necessário, mas nem sempre é possível distinguir entre uma string vazia e nula. Além disso, alguns sistemas de banco de dados (Oracle) não fazem distinção entre eles ( ''
são armazenados como DBNULL
), então você é forçado a lidar com eles igualmente. A razão para isso é que a maioria dos valores de string é proveniente da entrada do usuário ou de sistemas externos, enquanto nem as caixas de texto nem a maioria dos formatos de troca têm representações diferentes para ''
e null
. Portanto, mesmo que o usuário deseje remover um valor, ele não poderá fazer nada além de limpar o controle de entrada. Além disso, a distinção entre nvarchar
campos de banco de dados anuláveis e não anuláveis é mais do que questionável, se o seu DBMS não for Oracle - um campo obrigatório que permite''
é estranho, sua interface do usuário nunca permitiria isso; portanto, suas restrições não são mapeadas. Portanto, a resposta aqui, na minha opinião, é lidar com eles igualmente, sempre.
Em relação à sua pergunta sobre exceções e desempenho: Se você lançar uma exceção que não pode lidar completamente na lógica do seu programa, precisará abortar, em algum momento, o que o seu programa estiver fazendo e pedir ao usuário que refaça o que acabou de fazer. Nesse caso, a penalidade de desempenho de a catch
é realmente a menor das suas preocupações - ter que perguntar ao usuário é o elefante na sala (o que significa re-renderizar toda a interface do usuário ou enviar algum HTML pela Internet). Portanto, se você não seguir o antipadrão de " Fluxo de programa com exceções ", não se preocupe, basta lançar um se fizer sentido. Mesmo em casos limítrofes, como "Exceção de validação", o desempenho não é realmente um problema, pois é necessário perguntar novamente ao usuário, em qualquer caso.
if (!DataExists)
.