provenant d'un fond javascript, des collections comme les dictionnaires sont souvent implémentées comme des objets car leurs propriétés peuvent être référencées par association: Cependant, dans C # Il semble que nous devions choisir entre statique singleton classes et dictionnaires génériques pour chaque effet. Bien que j'aime que les cours soient fortement dactylographiés et donnent un soutien Intellisense, des méthodes de dictionnement offrent une flexibilité que je suis hésitant à abandonner. Y a-t-il des considérations de performance si grande en C # que je devrais choisir l'un sur l'autre? P> p>
8 Réponses :
En fait, une classe serait plusieurs ordres de grandeur plus rapidement qu'un dictionnaire code>. Si vous sentez que c'est plus pratique, c'est encore mieux :) Donc, si vous êtes capable de faire des cours pour cela, faites-le. Si les objets que vous représentez vraiment devraient être em> les classes (c'est-à-dire sont fondamentalement des objets et non des paires de clés / de valeur), alors de la plus grande raison. P>
Le C # Classe de dictionnaire est fortement saisi à l'aide de génériques. Vous spécifiez à la fois le type des touches et les valeurs lorsque vous l'utilisez. P>
Je recommanderais d'apprendre à propos de la classe de dictionnaire car vous êtes très probablement utile à de nombreuses fins. P>
Il est difficile de commenter plus loin sans en savoir plus sur votre cas d'utilisation, mais en général, je ne m'inquiéterais pas de la performance de la classe de dictionnaire jusqu'à ce que vous sachiez que c'est une question et le refacteur plus tard si c'est le cas. (Je prédisais courageusement que ce ne sera pas). P>
La classe avec des propriétés vous donnera une performance Boost et IntelliSense Support. D'autre part, le dictionnaire peut vous donner plus de flexibilité, si vous en avez besoin. P>
Puisque vous l'utilisez pour les données .... Un "DataTable" qui est une abstraction Microsoft de cela, est fondamentalement un grand dictionnaire. Vous voudrez peut-être enquêter sur le jeu car il a beaucoup de jouets qui viennent avec cela qui peut rendre votre vie beaucoup plus facile. P>
DataTable est une construction trop compliquée et gonflée pour le type de design dont il parle.
peut-être, dans les commentaires qu'il a indiqués, il peut travailler sur quelque chose de DataTable ** pourrait ** aider avec
Si vous voulez faire le type de canard de taper que vous faites dans JavaScript, mais en C #, vous pouvez utiliser l'expandoObject. Ceci est une classe .NET 4. Vous pouvez définir de manière dynamique ses propriétés telles que:
var myDictionary = myObject as IDictionary<string, object>; Console.WriteLine(myDictionary["namevalue1"]); // value1 Console.WriteLine(myDictionary["namevalue2"]); // value2
Votre exemple JavaScript ne correspond pas au dictionnaire ainsi que:
var myDictionary = []; myDictionary["namevalue1"] = "value1"; myDictionary["namevalue2"] = "value2";
+1 - Merci pour ce bit de conseil. Je suis d'accord avec tout dans votre réponse et votre mise en œuvre est certainement plus étroitement acceptable de ressembler à la "dictionnaire" - je viens de penser que mon exemple ressemblait à une classe C # plus étroitement et ressemblerait un peu plus familier à tous les experts C #. :)
Les deux seraient assez familiers, mon point est que lorsque votre question suggère que la JS a donné des correspondances C # approche de manière égale, elle correspond en réalité d'une de plus près que l'autre.
Ah, je vois ce que tu veux dire. Merci d'avoir souligné cela - je n'avais pas pensé de cette façon, mais vous avez absolument raison.
Cela dépend vraiment de votre cas d'utilisation. Les dictionnaires C # sont beaucoup plus performants que ce que vous pouvez en général attendre de votre code JavaScript. De plus, comme Le Don souligne, "Nous devrions oublier de petites gains d'efficacité, par exemple de 97% du temps; l'optimisation prématurée est la racine de tout mal " em>. J'ai fourni quelques exemples qui fournissent la même sortie que votre échantillon JavaScript:
Les classes sont nettement plus rapides que les dictionnaires. Cependant, les dictionnaires sont encore très rapides. Voici un .net Fiddle comparant leurs performances: https://dotnetfiddle.net/nbfw4s
Comme vous pouvez le constater, les classes sont un ordre de grandeur plus rapidement que les dictionnaires. Cependant, à 24 le code de la DOTNETFIDDLE: em> p>
Quel genre de cordes? Pour quoi les utiliseriez-vous?
La performance est généralement la dernière préoccupation lors de la discussion sur l'utilisation de propriétés / champs sur un objet par rapport à une seule propriété générique de dictionnaire. La sécurité type doit toujours être considérée comme plus précieuse que la performance dans cette situation (bien qu'elle ait tendance à être la même réponse ici).
@James: Je crée des mappages de colonnes pour un projet de conversion de données entre deux datasources dont les noms de colonne changent en fonction de la partie qui génère les données.
@ AJAX81 - BTW Quelle version du cadre ciblez-vous?
@ AJAX81 - Vous pouvez ensuite accomplir l'équivalent de votre objet JS avec la classe dLR
dynamicObject code> et le nouveau C # 4
dynamique code> mot-clé. C'est de loin plus près (et si mis en œuvre correctement a de meilleures performances) que le
DataTable code> comme suggéré. Cela fournira la dactylographie en vrac que vous êtes habitué. Malgré tout, la sécurité de type doit toujours être considérée comme avantageuse dans cette circonstance en raison des avantages de performance supplémentaires et du soutien IntelliSense.