qui est un peu éteint une question générale (mais je suis en utilisant c#), ce qui est le meilleur moyen (meilleures pratiques), retournez-vous collection nulle ou vide pour une méthode qui possède une collection comme un type de retour ?
Réponses
Trop de publicités?Vide de la collection. Toujours.
Cette suce:
if(myInstance.CollectionProperty != null)
{
foreach(var item in myInstance.CollectionProperty)
/* arrgh */
}
Il est considéré comme une meilleure pratique de ne JAMAIS revenir null
lors du retour d'une collection ou énumérables. TOUJOURS retourner un vide énumérable/collection. Il empêche la précités non-sens, et empêche votre voiture d'obtenir poussé par les co-travailleurs et les utilisateurs de vos classes.
Lorsque l'on parle de propriétés, définissez toujours votre propriété une fois et l'oublier
public List<Foo> Foos {public get; private set;}
public Bar() { Foos = new List<Foo>(); }
Lorsque l'on parle de méthodes qui retournent des enumerables, vous pouvez facilement retourner un vide énumérable au lieu de null
...
public IEnumerable<Foo> GetMyFoos()
{
return InnerGetFoos() ?? Enumerable.Empty<Foo>();
}
À l'aide de Enumerable.Empty<T>()
peut être considéré comme plus efficace que le renvoi, par exemple, un nouveau vide collection ou un tableau.
De la Conception du Cadre des lignes Directrices de la 2e Édition (pg. 256):
NE retournez PAS les valeurs null à partir de les propriétés de collection ou de méthodes le retour des collections. De retour d'un vide collection ou un tableau vide à la place.
Voici un autre article intéressant sur les avantages de ne pas retourner les valeurs null (j'ai essayé de trouver quelque chose sur Brad Abram blog, et qu'il a lié pour l'article).
Edit- Eric Lippert a maintenant fait des remarques à la question d'origine, j'aimerais aussi le lien pour son excellent article.
Dépend de votre contrat et de votre cas concret. Généralement il est préférable de revenir à vide collections, mais parfois (rarement):
-
null
pourrait signifier quelque chose de plus précis; - votre API (contrat) pourrait vous forcer à revenir
null
.
Quelques exemples concrets:
- un composant de l'INTERFACE utilisateur (à partir d'une bibliothèque hors de votre contrôle), pourrait être rendu d'une table vide, si vide de collecte est passé, ou pas de table à tous, si une valeur null est passé.
- dans un Objet-XML (JSON/whatever), où
null
signifie que l'élément est manquant, tandis qu'un regroupement vide rendrait redondant (et peut-être incorrectes)<collection />
- vous utilisez ou la mise en œuvre d'une API, qui stipule explicitement que null doit être retourné/passé
Il y a un autre point qui n’a pas encore été mentionné. Examinons le code suivant :
Le langage c# retourne un énumérateur vide lorsque vous appelez cette méthode. Par conséquent, pour être cohérente avec la langue conception (et, par conséquent, les attentes programmeur) une collection vide doit être retournée.