Вспомогательные функции для безопасного преобразования строк

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

  •  05-07-2019
  •  | 
  •  

Вопрос

Вернувшись в VB6, я написал несколько функций, которые позволяли мне писать код, не заботясь о разнице между null и '' для строк, null и 0 для чисел и т. д.Ничто так не снижает мою производительность при кодировании, как необходимость добавлять специальный код для работы с данными, который может вызвать ненужную ошибку;9999/10000: если что-то, что я использую в качестве числа, равно нулю, то на самом деле я рассматриваю это как 0.

Сейчас я работаю на C#, и разница между VB6 и C# 2005 довольно велика... поэтому я действительно не знаю, с чего начать писать свой новый набор вспомогательных функций, и нужно ли мне вообще их делать. .

Итак, мне нужно написать функцию, которая будет принимать строку, поле базы данных, форму запроса/поле запроса, ???, а затем делать все возможное, чтобы превратить ее в Double и вернуть ее вызывающей процедуре. .

Мне также нужно было бы сделать это для шорт, int16, int32, long и всего остального, что меня может волновать.

Тогда я бы сделал это для строк.И Даты.

Стоит ли это заниматься?Есть ли что-то в рамках или C#, что я могу использовать вместо этого?Мне действительно хочется чего-то, что позволило бы мне использовать встроенные данные при вызове других функций без необходимости создавать временные переменные и т. д.

Это было полезно?

Решение

Есть множество встроенных функций преобразования.Но...я не уверен, что кто-то из них делает именно то, что вы хотите.Как правило, методы .NET допускают ошибку при передаче недопустимых входных данных и вызывают исключение.

К счастью, вы можете легко написать служебный метод для преобразования строкового представления числового значения, пустой строки или пустой строки в любой тип вывода:

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

Использовать:

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

Этот универсальный метод получает тип возвращаемого значения из типа второго аргумента, который используется в качестве значения по умолчанию, когда переданная строка имеет значение NULL или пуста.Проходить 0 и ты получишь In32 назад.Проходить 0L, Int64.И так далее...

Другие советы

В C # большинство типов данных не обнуляются (числа, даты и т. д.), обнуляются только строки. Если вы получаете данные из БД, вы, вероятно, будете работать с Nullable или его синтаксически-засахаренная версия, int ?, double?, DateTime ?, и т. д.

У всех nullables есть метод , который позволяет вам получить их фактическое значение или значение по умолчанию, если они равны нулю. Это должно помочь вам избежать создания этих функций.

Что касается строк, у вас есть функция String.IsNullOrEmpty (str).

Вы также можете добавить методы расширения , если вам нужны специальные недоступный функционал. Обратите внимание, что методы расширения могут применяться к нулевым значениям, если вы обрабатываете их в коде. Например:

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

В библиотеке .NET есть класс Convert. У него есть функции, которые позволяют вам преобразовывать во все, что вам нужно, из любого базового типа и нескольких общих классов (например, DateTime.)

Это в основном работает как Convert.ToInt32 (val);

РЕДАКТИРОВАТЬ: Мне действительно нужно научиться читать все слова. Не уловил беспокойство по поводу нуля ... для этого есть оператор. Вы можете использовать ?? проверить на ноль и предоставить значение по умолчанию, однако, чтобы это могло работать.

Возможно, вы захотите просто заглянуть в LINQ, он обрабатывает множество подобных карт для вас.

Я думаю, что это похоже на @ Shog9. Я просто добавляю try catch для обработки необычного пользовательского ввода. Я посылаю тип, в который я хочу преобразовать входные данные и принимаю входные данные как объект.

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

Теперь позвоните им, как показано ниже

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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top