2008-10-04 4 views
10

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

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

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

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

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

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

ответ

33

Есть встроенные функции конверсии. Но ... я не уверен, что кто-то из них сделает именно то, что вы хотите. Как правило, методы .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 назад. Pass 0L, Int64. И так далее ...

+0

Мне очень нравится этот для использования дженериков и как это может спасти меня сделать десятки методов. Благодаря! – 2008-10-05 02:16:23

6

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

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

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

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

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

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

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

EDIT: Мне действительно нужно научиться читать все слова. Не уловил беспокойство по поводу нулевого ... для этого есть оператор. Вы можете использовать чтобы проверить значение null и предоставить значение по умолчанию, но это может сработать.

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

0

Я думаю, что это похоже на @ 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); 

 Смежные вопросы

  • Нет связанных вопросов^_^