2009-09-27 5 views
1

Je suis en train d'écrire une application financière où le concept de 'Prix' est beaucoup utilisé. Il est actuellement représenté par le type C# decimal. Je voudrais le rendre plus explicite et être en mesure de le changer à double dans le futur, donc je pensais à créer une structure 'Price' qui agirait exactement de la même manière que le type décimal (peut-être ajouter un peu de validation comme doit être supérieur à 0).Utiliser des structures en C# pour des valeurs de domaine simples

Selon vous, quels sont les avantages et les inconvénients de cela?

+0

peut-être devrait-il plutôt être membre d'un prototype/classe virtuelle hérité par la classe d'objets, accessible avec get/setters? –

+0

@Nona: Désolé, je ne comprends pas. Que voulez-vous dire exactement et à quoi cela sert-il? –

+0

bien que je puisse me tromper, mais il me semble (comme moi) qu'une structure devrait être utilisée pour contenir un ensemble de valeurs, et non pour être simplement un emballage pour une seule donnée. Parce que le «prix» est une seule donnée, et parce que le prix est inutile (prix de quoi?), Il devrait plutôt être une propriété de la classe plus grande (prix de l'article). Les g/setters vous permettront de mettre plus tard la logique dans leur récupération/altération. Enfin, j'ai suggéré une classe virtuelle pour vous permettre d'avoir des types d'éléments fondamentalement différents, mais héritant de leurs caractéristiques de base, et vous forçant à remplacer ce que vous savez changer. –

Répondre

0

Il ne devrait pas y avoir de raison de changer le type de données pour une quantité comme celle-ci; Toutefois, vous pouvez décider d'ajouter d'autres informations telles que la devise ou le nombre de décimales à suivre dans les calculs. L'utilisation d'une structure à ce stade vous fera donc économiser BEAUCOUP de temps.

4

Les structures doivent être utilisées pour les petits types qui seront (à mon avis) immuables, c'est-à-dire des types de valeur. Je ne suis pas sûr de ce que vous entendez par "beaucoup utilisé", mais si ces structures seront largement utilisées dans les opérations critiques de performance, vous devrez prendre en compte le prix de leur copie par rapport au prix de l'allocation de tas. Je doute que vous ayez besoin de prendre cela en compte, mais c'est quelque chose à penser. Je trouve rarement le besoin d'utiliser des structures dans mes activités quotidiennes. De plus, comme le souligne Jonathan, l'utilisation du double type pour de l'argent est une mauvaise idée. Le type décimal est beaucoup mieux adapté aux calculs financiers.

Encore un autre côté; vous entendrez probablement beaucoup de réponses qui parlent de l'allocation de tas pile v, de sorte que cet article peut vous intéresser:

http://blogs.msdn.com/ericlippert/archive/2009/04/27/the-stack-is-an-implementation-detail.aspx

+2

Grand article, à lire absolument. –

+1

Merci Michael, c'est gentil de votre part. –

5

S'il vous plaît ne pas utiliser double pour l'argent. Vous devrez vous rappeler de l'arrondir pour afficher partout vous l'utilisez à, et vous avez des problèmes de précision potentiels si vous divisez ou multipliez par de grands nombres. Decimal donnera des erreurs de débordement, le double perdra juste sa précision. Je ne suis pas sûr de vous, mais avec de l'argent, je préférerais une erreur et une opération avortée pour procéder silencieusement à une perte de précision. Si quoi que ce soit, en fonction des projets que j'ai été sur, vous pouvez envisager d'utiliser une structure qui a un nombre décimal et une indication de quelle monnaie il est.

+1

Merci pour le rappel. C'est la raison pour laquelle j'utilise la décimale en ce moment. Je ne prévois pas de le changer pour doubler dans le futur, juste être en mesure de le changer sans avoir à refactoriser l'ensemble de l'application. –

-1

Les structures peuvent ne pas être accessibles à partir des langages .NET autres que C#. Les erreurs d'arrondi pourraient aussi être un problème. Pourquoi ne pas simplement créer une classe Money et stocker la valeur en tant que décimal et la devise utilisée.

+0

Voulez-vous dire une classe par opposition à une structure? –

+0

Je voulais dire classe. J'ai maintenant mis à jour ma réponse. Je ne sais pas pourquoi j'ai été déprimé. –

Questions connexes