Вспомогательные функции для безопасного преобразования строк
-
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);