2010-10-28 6 views
0

Prenez cet exemple:Comment se débarrasser des frais généraux de conversion?

customer.Salary = Convert.ToDecimal(string.Format("{0}! ", Console.ReadLine().ToString())); 

(1) Pourquoi C# nous devons toujours mettre .ToString() pour y arriver?

(2) Convert.To ... Cela ne crée-t-il pas des frais inutiles? En outre dans le code ci-dessous: Il donne une erreur: "La chaîne d'entrée n'était pas dans un format correct", après avoir accepté l'entrée de l'utilisateur.

// Main begins program execution. 
    public static void Main() 
    { 
     Customer customer = new Customer(); 
     // Write to console/get input 
     Console.Write("Enter customer's salary: "); 
     customer.Salary = Convert.ToDecimal(string.Format("{0}! ", Console.ReadLine().ToString())); 
     Console.WriteLine("Salary in class variable is: {0}", customer.Salary.ToString()); 
     Console.Read(); 
    } 

    class Customer 
    { 
     public Decimal Salary { get; set; } 
    } 

Là encore, soit je dois utiliser:

string sal = Convert.ToDecimal(string.Format("{0}! ", Console.ReadLine().ToString())); 
customer.Salary = Convert.ToDecimal(sal); 

Ou, je dois changer le type de données lui-même dans la classe client.

Cette surcharge peut-elle être évitée avec n'importe quoi dans les génériques?

Répondre

4
  1. Vous n'avez pas besoin d'appeler .ToString().
  2. Oui, c'est le cas.

Vous essayez d'écrire

customer.Salary = Decimal.Parse(Console.ReadLine()); 

Votre code actuel effectue les opérations suivantes:

  • Console.ReadLine(): Lit une ligne de la console, le retour d'un objet String.
  • (...).ToString() Renvoie la même String objet
  • string.Format("{0}! ", (...)): Renvoie un nouvel objet String contenant la chaîne originale suivie par !.
  • Convert.ToDecimal((...)): Essaie d'analyser cela en une valeur Decimal.
    Depuis la chaîne se termine par !, il ne
1

Je pense que vous serez plus heureux si vous utilisez Decimal.Parse ou Decimal.TryParse pour faire les conversions, plutôt que de compter sur Convert.ToDecimal. Vous pouvez écrire:

Decimal tempSal; 
string sal = Console.ReadLine(); 
if (Decimal.TryParse(sal, out tempSal)) 
{ 
    customer.Salary = tempSal; 
} 
else 
{ 
    // user entered bad data 
} 
+0

Pouvez-vous expliquer comment fonctionne en interne Convert.ToDecimal et Decimal.Parse? – RKh

+1

En général, vous devriez préférer 'Decimal.TryParse' car il tente la conversion et retourne 'false' si la conversion a échoué. 'Convert.ToDecimal', d'autre part, déclenche une exception en cas d'erreur. Particulièrement dans le code de l'interface utilisateur, il est beaucoup plus facile de gérer une valeur de retour «false» que de gérer des exceptions. En interne, je ne sais pas vraiment comment les deux diffèrent. Je suppose que lors de la conversion d'une chaîne en décimal, 'Convert.ToDecimal' finit par appeler' Decimal.Parse'. –

Questions connexes