Retornando uma coleção nula ou vazia: práticas recomendadas
Ao projetar um método que retorna uma coleção como tipo de valor de retorno, surge uma pergunta: ele deve retornar nulo ou uma coleção vazia? As melhores práticas recomendam fortemente o retorno de uma coleção vazia em todos os casos.
Por que escolher uma coleção vazia?
Retornar nulo é uma prática ruim porque leva à complexidade desnecessária do código e possíveis erros de tempo de execução. Por exemplo, se você retornar nulo para uma propriedade de coleção:
if(myInstance.CollectionProperty != null)
{
foreach(var item in myInstance.CollectionProperty)
/* 如果 CollectionProperty 为 null,此代码可能会失败 */
}
Este código pode causar uma exceção se myInstance.CollectionProperty for realmente nulo. Em vez disso, é melhor retornar uma coleção vazia, garantindo que o código acima ainda possa ser executado sem erros.
Práticas recomendadas de atributos
Para propriedades que retornam uma coleção, é recomendado inicializar a propriedade apenas uma vez. Isso pode ser feito durante o construtor da classe que contém a propriedade:
public List Foos { public get; private set; }
public Bar() { Foos = new List(); }
Com C# 6, uma versão mais concisa está disponível:
public List Foos { get; } = new List();
Práticas recomendadas de método
Para métodos que retornam uma coleção, se a coleção real não existir, uma coleção vazia será retornada. Você pode usar o método Enumerable.Empty
public IEnumerable GetMyFoos()
{
return InnerGetFoos() ?? Enumerable.Empty();
}
Essa abordagem garante que mesmo que InnerGetFoos() retorne nulo, o método ainda retorne uma coleção vazia, evitando possíveis erros.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3