Les dictionnaires (C # ou autre) sont simplement un conteneur où vous recherchez une valeur basée sur une clé. Dans de nombreuses langues, il est plus correctement identifié comme une carte, l'implémentation la plus courante étant un HashMap.
Le problème à considérer est ce qui se passe lorsqu'une clé n'existe pas. Certaines langues se comportent en retournant null
ounil
ou une autre valeur équivalente. La valeur par défaut silencieuse à une valeur au lieu de vous informer qu'une valeur n'existe pas.
Pour le meilleur ou pour le pire, les concepteurs de bibliothèques C # ont trouvé un idiome pour gérer le comportement. Ils ont estimé que le comportement par défaut pour rechercher une valeur qui n'existe pas est de lever une exception. Si vous souhaitez éviter les exceptions, vous pouvez utiliser la Try
variante. C'est la même approche qu'ils utilisent pour analyser les chaînes en entiers ou en objets date / heure. Essentiellement, l'impact est le suivant:
T count = int.Parse("12T45"); // throws exception
if (int.TryParse("12T45", out count))
{
// Does not throw exception
}
Et cela a été reporté au dictionnaire, dont l'indexeur délègue Get(index)
:
var myvalue = dict["12345"]; // throws exception
myvalue = dict.Get("12345"); // throws exception
if (dict.TryGet("12345", out myvalue))
{
// Does not throw exception
}
C'est simplement la façon dont la langue est conçue.
Devrait out
il décourager les variables?
C # n'est pas la première langue à les avoir, et ils ont leur raison d'être dans des situations spécifiques. Si vous essayez de créer un système hautement simultané, vous ne pouvez pas utiliser de out
variables aux limites de concurrence.
À bien des égards, s'il existe un idiome qui est adopté par les fournisseurs de langue et de bibliothèque de base, j'essaie d'adopter ces idiomes dans mes API. Cela rend l'API plus cohérente et à l'aise dans cette langue. Une méthode écrite en Ruby ne ressemblera donc pas à une méthode écrite en C #, C ou Python. Ils ont chacun une façon préférée de créer du code, et travailler avec cela aide les utilisateurs de votre API à l'apprendre plus rapidement.
Les cartes en général sont-elles un anti-modèle?
Ils ont leur but, mais souvent, ils peuvent être la mauvaise solution pour le but que vous avez. Surtout si vous avez besoin d'une cartographie bidirectionnelle. Il existe de nombreux conteneurs et façons d'organiser les données. Il existe de nombreuses approches que vous pouvez utiliser, et parfois vous devez réfléchir un peu avant de choisir ce conteneur.
Si vous avez une très courte liste de valeurs de mappage bidirectionnel, vous n'aurez peut-être besoin que d'une liste de tuples. Ou une liste de structures, où vous pouvez tout aussi facilement trouver la première correspondance de chaque côté du mappage.
Pensez au domaine problématique et choisissez l'outil le plus approprié pour le travail. S'il n'y en a pas, créez-le.