Fonctions d'assistance pour une conversion en toute sécurité à partir de chaînes

StackOverflow https://stackoverflow.com/questions/170665

  •  05-07-2019
  •  | 
  •  

Question

De retour dans VB6, j’ai écrit quelques fonctions qui me permettaient de coder sans me soucier de la différence entre null et '' pour les chaînes, null et 0 pour les nombres, etc. Rien ne tue plus ma productivité lors du codage que du ajouter un code de cas spécial pour traiter les données pouvant causer une erreur non pertinente; 9999/10000 si quelque chose que j'utilise en tant que nombre est nul, alors je le traite vraiment comme un 0.

Je suis maintenant en C # et la différence entre VB6 et C # 2005 est assez importante ... je ne sais donc pas vraiment par où commencer pour écrire mon nouvel ensemble de fonctions d'assistance, ni même si j'ai besoin de le faire. du tout.

Donc, je dois écrire une fonction qui accepterait une chaîne, un champ de base de données, un formulaire de requête / un champ de requête, ???, puis faire le nécessaire pour le transformer en Double et le renvoyer à la procédure d'appel.

J'aurais aussi besoin de faire cela pour les courts métrages, int16, int32, long, tout ce qui pourrait m'intéresser.

Ensuite, je le ferais pour les chaînes. Et les dates.

Est-ce une poursuite valable? Y a-t-il quelque chose dans le framework ou C # que je peux utiliser à la place? Je souhaite vraiment quelque chose qui me permettrait d’utiliser des données en ligne pour appeler d’autres fonctions, sans devoir créer de variables temporaires, etc.

.

Était-ce utile?

La solution

Il existe des scads de fonctions de conversion intégrées. Mais ... je ne suis pas sûr qu'aucun d'entre eux fasse exactement ce que vous voulez. Généralement, les méthodes .NET sont prudentes lorsqu'elles sont transmises à une entrée non valide et génèrent une exception.

Heureusement, vous pouvez facilement écrire une méthode utilitaire pour convertir une représentation sous forme de chaîne d'une valeur numérique, une chaîne vide ou une chaîne nulle en n'importe quel type de sortie:

public static T SafeConvert<T>(string s, T defaultValue)
{
    if ( string.IsNullOrEmpty(s) )
        return defaultValue;
    return (T)Convert.ChangeType(s, typeof(T));
}

Utiliser:

SafeConvert(null, 0.0) == 0.0;
SafeConvert("", 0.0) == 0.0;
SafeConvert("0", 0.0) == 0.0;

Cette méthode générique tire son type de retour du type du deuxième argument, utilisé comme valeur par défaut lorsque la chaîne transmise est null ou vide. Si vous transmettez 0 , vous obtiendrez un In32 . Passez 0L , Int64 . Et ainsi de suite ...

Autres conseils

En C #, la plupart des types de données ne sont pas nullables (nombres, dates, etc.), seules les chaînes sont nullables. Si vous obtenez des données d'une base de données, vous travaillerez probablement avec Nullable , ou sa version syntactique-sucrée, int ?, double ?, DateTime?, etc.

Tous les éléments nullables utilisent une méthode pour obtenir leur valeur réelle ou une valeur par défaut si elles sont nulles. Cela devrait vous aider à éviter de créer ces fonctions.

En ce qui concerne les chaînes, vous avez la fonction String.IsNullOrEmpty (str).

Vous pouvez également ajouter des méthodes d'extension si vous souhaitez utiliser des méthodes spéciales. fonctionnalité non disponible. Notez que les méthodes d'extension peuvent être appliquées aux valeurs NULL, tant que vous les gérez dans le code. Par exemple:

public static string ValueOrDefault(this string str) 
{
     if (String.IsNullOrEmpty(str)) return MY_DEFAULT_VALUE;
     else return str;
}

Il existe une classe appelée Convert dans la bibliothèque .NET. Il a des fonctions qui vous permettent de convertir tout ce dont vous avez besoin à partir de n'importe quel type de base et de quelques classes communes (comme DateTime.)

Cela fonctionne fondamentalement comme Convert.ToInt32 (val);

EDIT: J'ai vraiment besoin d'apprendre à lire tous les mots. Je n'ai pas compris l'inquiétude pour null ... il y a un opérateur pour cela. Vous pouvez utiliser le ?? pour vérifier la valeur NULL et fournir une valeur par défaut pour que cela puisse fonctionner.

Vous pouvez également vous intéresser à LINQ, il gère une grande partie de ce type de mappage pour vous.

Je pense que cela ressemble à @ Shog9. Je viens d'ajouter un essai pour gérer les entrées inhabituelles de l'utilisateur. J'envoie le type dans lequel je veux convertir l'entrée et prend l'entrée comme objet.

public static class SafeConverter
{
   public static T SafeConvert<T>(object input, T defaultValue)
   {
       if (input == null)
          return defaultValue; //default(T);

       T result;
       try
       {
           result = (T)Convert.ChangeType(input.ToString(), typeof(T));
       }
       catch
       {
          result = defaultValue; //default(T);
       }
       return result;
   }
} 

Appelez-les comme ci-dessous

SafeConverter.SafeConvert<ushort>(null, 0);
SafeConverter.SafeConvert<ushort>("", 0);
SafeConverter.SafeConvert<ushort>("null", 0);
SafeConverter.SafeConvert<ushort>("-1", 0);
SafeConverter.SafeConvert<ushort>("6", 0);
SafeConverter.SafeConvert<ushort>(-1, 0);
SafeConverter.SafeConvert<ushort>(0, 0);
SafeConverter.SafeConvert<ushort>(1, 0);
SafeConverter.SafeConvert<ushort>(9, 0);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top