Frage

Zurück in VB6 schrieb ich ein paar Funktionen, mit denen ich mich um den Unterschied zwischen Null und '' für Zeichenfolgen, Null und 0 für Zahlen kümmern musste. Nichts tötet meine Produktivität mehr beim Codieren ab, als einen speziellen Fall hinzuzufügen Code für den Umgang mit Daten, die einen irrelevanten Fehler verursachen können; 9999/10000 Wenn etwas, das ich als Zahl verwende, ist NULL, dann behandle ich es wirklich als 0.

Ich bin jetzt in C# und der Unterschied zwischen VB6 und C# 2005 ist ziemlich umfangreich ... also weiß ich nicht wirklich, wo ich anfangen soll, meine neuen Helferfunktionen zu schreiben, oder ob ich sie überhaupt machen muss .

Ich muss also eine Funktion schreiben, die eine Zeichenfolge, ein Datenbankfeld, ein Anforderungsformular-/Abfragebereich akzeptiert, und dann tun, was auch immer es tun könnte, um dies in ein Doppel zu verwandeln und dies an das Anrufverfahren zurückzugeben .

Ich musste dies auch für Shorts, INT16, INT32, lange, alles andere tun, was mir möglicherweise interessiert ist.

Dann würde ich das für Saiten tun. Und Daten.

Ist das eine lohnende Verfolgung? Gibt es etwas im Framework oder C#, das ich stattdessen verwenden kann? Ich wünsche mir wirklich etwas, das es mir ermöglichen würde, Daten zu verwenden, um andere Funktionen aufzurufen und keine temporären Variablen usw. erstellen zu müssen.

War es hilfreich?

Lösung

Es sind Scads von Conversion-Funktionen integriert. Aber ... ich bin mir nicht sicher, ob einer von ihnen genau das tut, was Sie wollen. Im Allgemeinen fangen .NET -Methoden auf der Seite der Vorsicht, wenn sie ungültige Eingaben übergeben haben, und geben Sie eine Ausnahme.

Glücklicherweise können Sie problemlos eine Dienstprogrammmethode schreiben, um eine String -Darstellung eines numerischen Werts, einer leeren Zeichenfolge oder einer Null -Zeichenfolge in einen beliebigen Ausgabeart zu konvertieren:

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

Verwenden:

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

Diese generische Methode enthält ihren Rückgabetyp vom Typ des zweiten Arguments, der als Standardwert verwendet wird, wenn die übergebene Zeichenfolge null oder leer ist. Passieren 0 Und du würdest eine bekommen In32 der Rücken. Passieren 0L, Int64. Usw...

Andere Tipps

In C# sind die meisten Datentypen nicht nullbar (Zahlen, Daten usw.), nur Zeichenfolgen sind Nullables. Wenn Sie Daten von einer DB erhalten, werden Sie wahrscheinlich mit arbeiten Nullbar, oder seine syntaktisch-sugared-Version, int ?, double?, datetime?, usw.

Alle Nullables haben eine Methode Dadurch können Sie ihren tatsächlichen Wert oder einen Standardwert erhalten, wenn sie null sind. Dies sollte Ihnen helfen, diese Funktionen zu erstellen.

In Bezug auf Zeichenfolgen haben Sie die Funktion von String.isnullorEmpty (STR).

Du kannst es auch Erweiterungsmethoden hinzufügen Wenn Sie eine spezielle nicht verfügbare Funktionalität wünschen. Beachten Sie, dass Erweiterungsmethoden auf Nullwerte angewendet werden können, solange Sie sie im Code verarbeiten. Zum Beispiel:

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

Es gibt eine Klasse namens Convert in der .NET -Bibliothek. Es verfügt über Funktionen, mit denen Sie von jedem Basistyp und einigen der gängigen Klassen (wie DateTimezeit) in alles konvertieren können, was Sie benötigen.

Es funktioniert im Grunde wie convert.toint32 (val);

Bearbeiten: Ich muss wirklich lernen, alle Wörter zu lesen. Ich habe die Sorge um NULL nicht besorgt ... dafür gibt es einen Bediener. Du kannst den ... benutzen ?? Um nach Null zu suchen und einen Standard zu liefern, kann dies jedoch funktionieren.

Vielleicht möchten Sie auch nur in Linq schauen, es behandelt eine Menge dieser Art von Mapping für Sie.

Ich denke, es ähnlich wie @Shog9. Ich füge nur einen Versuch hinzu, den Benutzer ungewöhnliche Eingaben zu verarbeiten. Ich sende den Typ, in dem ich die Eingabe konvertieren und die Eingabe als Objekt nehme.

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;
   }
} 

Nennen Sie sie jetzt wie unten wie unten

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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top