2015-08-21 6 views
0

Je cherche à multiplier une valeur dans le champ de support set en C# (pour une application ASP.NET MVC). Je fais ceci pour éviter issues with dividing floating point numbers et donc les propriétés sont des entiers qui doivent être multipliés et divisés pour l'apparence et ensuite stockés en tant que décimales.Multiplier la valeur dans le champ Backinging en C#

Après la answer here, je suis en train d'utiliser les champs de support pour compléter ces opérations sur une propriété comme ceci:

public decimal SomeDecimal 
{ 
    get 
    { 
     return this.SomeDecimal/100; 
    } 
    set 
    { 
     this.SomeDecimal = this.SomeDecimal * 100; 
    } 
} 

Je reçois l'avertissement suivant:

uniquement affectation , appeler, incrémenter, décrémenter, attendre, et de nouvelles expressions d'objet peuvent être utilisées comme une déclaration

Quelqu'un peut-il expliquer le pr Opérer moyen de multiplier et de diviser le nombre sans le faire dans la vue/contrôleur.

+0

Pour commencer, vous avez besoin d'un champ de support. Sinon, vous avez une boucle infinie qui vous donnera un débordement de pile la première fois que vous essayerez d'obtenir 'SomeDecimal'. –

Répondre

3

Un champ de support est un membre distinct de votre propriété. Il est généralement déclarée comme privée, du même type que la propriété, et avec le même nom, mais en camelCase ou avec un trait de soulignement:

private decimal someDecimal; 

Ensuite, votre propriété est définie à lire et écrire dans ce domaine. Dans le cas du compositeur, vous utilisez le mot-clé value pour obtenir la valeur qui a été affectée à la propriété:

public decimal SomeDecimal 
{ 
    get 
    { 
     return this.someDecimal/100; 
    } 
    set 
    { 
     this.someDecimal = value * 100; 
    } 
} 

Modifier: Votre préoccupation sur la perte de précision de l'arithmétique en virgule flottante pourrait être inapplicable en l'espèce . Contrairement à float et double, qui sont stockées comme des représentations de base-2, decimal est stocké dans la base 10. Il ne devrait jamais y avoir de perte de précision si vous effectuez des calculs arithmétiques simples (tels que des sommations) sur des valeurs monétaires raisonnables avec deux décimales - le type a été conçu à cette fin.

+0

Cela fait beaucoup plus de sens maintenant. Merci pour votre explication! (Acceptera une fois la limite de temps passée) – Gareth

+0

Merci pour l'info autour des points flottants. Le problème que j'ai dans ce cas est que les valeurs sont interprétées par javascript côté client pour une application de style calculatrice (qui n'aime pas les décimales!) – Gareth

2

Lorsque vous référence this.SomeDecimal dans le getter et le setter pour SomeDecimal vous créez une récursion infinie.

Vous souhaitez créer un champ privé qui stocke la valeur true, puis utilisez la propriété pour l'obtenir et la définir en fonction de votre schéma de multiplication/division.

private decimal _someDecimal; 
public decimal SomeDecimal 
{ 
    get 
    { 
     return _someDecimal/100; 
    } 
    set 
    { 
     _someDecimal = value * 100; 
    } 
} 
+0

Merci pour votre explication! – Gareth