Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
4 / 4 / 0
Регистрация: 28.07.2015
Сообщений: 23

Тормозит try catch при ошибке Convert

10.02.2016, 08:21. Показов 1606. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Поясню давно использую такую вот универсальную функцию для конвертирования данных

C#
1
2
3
4
5
6
7
8
9
10
11
 public static T ConvertTo<T>(object o, T def = default(T))
    {
        try
        {
            return (T)Convert.ChangeType(o, typeof(T));
        }
        catch (Exception)
        {
            return def;
        }
    }
Она работает хорошо и удачно позволят обрабатывать ситуации когда пользователь ввел что попало в некритичное поле или реагировать на ситуацию когда из базы пришла какая нибудь неведома-зверушка. Но есть проблема при больших объемах неконвертируемых данных (когда часто падает на catch ) эта конструкция начинает тормозить не по детски. вот собственно вопрос есть ли способ переделать это на конструкцию if/else возможно у Convert есть метод на подобие isConvertable ?
Заранее благодарен за любые советы по оптимизации этой функции.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.02.2016, 08:21
Ответы с готовыми решениями:

Вывести информацию об ошибке в catch
Не могу сделать вывод сообщение при ошибке SmtpClient Smtp = new SmtpClient(&quot;smtp.yandex.ru&quot;, 25); Smtp.Credentials =...

Как вывести сообщение об ошибке в блоке Try Catch
Привет. Сохраняю файл Visio: dim name as string=&quot;C: тут весь путь&quot; if name&lt;&gt;&quot;&quot; then try ...

Сообщение об ошибке try catch выдать только первый раз
Здравствуйте. Я отлавливаю ошибку при подключении к базе данны так: try { con.Open; ...

7
71 / 58 / 31
Регистрация: 05.09.2013
Сообщений: 666
10.02.2016, 12:11
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public static T ConvertTo<T>(object o, T def = default(T))
        {
            try
            {
                if (o is T)
                {
                    Console.WriteLine("Is OK");
                    return (T)Convert.ChangeType(o, typeof(T));
                }
                else
                {
                    Console.WriteLine("Is Fail");
                    return def;
                }
                
            }
            catch (Exception)
            {
                return def;
            }
        }
Может что-то вроде этого применять?
PS: Архитектуру метода оставил прежней
0
Неадекват
 Аватар для freeba
1501 / 1237 / 248
Регистрация: 02.04.2010
Сообщений: 2,807
10.02.2016, 12:30
halk0812, Данный метод годится только для распаковки данных, но например, если в object лежит int, а T соответствует double - метод отработает не так как исходный. Думаю ТС подразумевал возможность автокаста если типы это допускают.

Для ссылочных типов есть универсальное решение типа:
C#
1
2
3
4
public static T ConvertToClass<T>(object o, T def = default(T)) where T : class
        {
            return o as T;
        }
А вот со значимыми типами сложнее, в .net готового решения нет, придется все делать руками:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
 
namespace ConsoleApplication21
{
    class Program
    {
        static void Main(string[] args)
        {
            var b = 34;
 
            var c = ConvertToValue<double>(b);
 
            Console.WriteLine(c.GetType());
            Console.ReadKey();
        }
 
        public static T ConvertToValue<T>(object o, T def = default(T)) where T : struct
        {
            var type = typeof(T);
            if (o.GetType().IsCastableTo(type)) return (T)Convert.ChangeType(o, typeof(T));
            else return def;
        }
    }
 
    static class TypeExtensions
    {
        static Dictionary<Type, List<Type>> dict = new Dictionary<Type, List<Type>>() {
        { typeof(decimal), new List<Type> { typeof(sbyte), typeof(byte), typeof(short), typeof(ushort), typeof(int), typeof(uint), typeof(long), typeof(ulong), typeof(char) } },
        { typeof(double), new List<Type> { typeof(sbyte), typeof(byte), typeof(short), typeof(ushort), typeof(int), typeof(uint), typeof(long), typeof(ulong), typeof(char), typeof(float) } },
        { typeof(float), new List<Type> { typeof(sbyte), typeof(byte), typeof(short), typeof(ushort), typeof(int), typeof(uint), typeof(long), typeof(ulong), typeof(char), typeof(float) } },
        { typeof(ulong), new List<Type> { typeof(byte), typeof(ushort), typeof(uint), typeof(char) } },
        { typeof(long), new List<Type> { typeof(sbyte), typeof(byte), typeof(short), typeof(ushort), typeof(int), typeof(uint), typeof(char) } },
        { typeof(uint), new List<Type> { typeof(byte), typeof(ushort), typeof(char) } },
        { typeof(int), new List<Type> { typeof(sbyte), typeof(byte), typeof(short), typeof(ushort), typeof(char) } },
        { typeof(ushort), new List<Type> { typeof(byte), typeof(char) } },
        { typeof(short), new List<Type> { typeof(byte) } }
    };
        public static bool IsCastableTo(this Type from, Type to)
        {
            if (to.IsAssignableFrom(from)) return true;
            if (dict.ContainsKey(to) && dict[to].Contains(from)) return true;
 
            return from.GetMethods(BindingFlags.Public | BindingFlags.Static).Any(m => m.ReturnType == to && (m.Name == "op_Implicit" || m.Name == "op_Explicit"));
        }
    }
}
1
141 / 117 / 26
Регистрация: 07.12.2014
Сообщений: 371
10.02.2016, 12:30
А почему нельзя вместо этого as использовать? Или Convert.ChangeType имеет какие-то преимущества/другое поведение?

Опередили
0
Покинул форум
3700 / 1483 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
10.02.2016, 14:25
Vigelforts, as выполняет нисходящее приведение и в случае неудачи возвращает null, при этом as не может выполнять специальные (числовые в том числе) преобразования.
0
4 / 4 / 0
Регистрация: 28.07.2015
Сообщений: 23
10.02.2016, 14:50  [ТС]
Решения очень интересные, что бы учитывать особенно сложные случаи (строку в дату) придется много вато кейсов писать и всего такого .
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
10.02.2016, 15:17
Цитата Сообщение от freeba Посмотреть сообщение
return o as T;
Цитата Сообщение от Vigelforts Посмотреть сообщение
А почему нельзя вместо этого as использовать? Или Convert.ChangeType имеет какие-то преимущества/другое поведение?
Convert.ChangeType не имеет никакого отношения к приведению типов через as.
Метод ChangeType пытается преобразовать тип, а не привести.
Например, метод ChangeType может преобразовать строку "124" в тип byte. Никакой as этого не сделает.
freeba, А строки? А интерфейс IConvertible, который используется в ChangeType ? А то, что рефлекшен будет не быстрее try/catch? Нет, совсем не то.
0
Неадекват
 Аватар для freeba
1501 / 1237 / 248
Регистрация: 02.04.2010
Сообщений: 2,807
10.02.2016, 16:00
Цитата Сообщение от Storm23 Посмотреть сообщение
А строки? А интерфейс IConvertible, который используется в ChangeType ?
А что строки? Строка это строка, если вы в ней храните число, то это выдает очень большие проблемы в архитектуре приложения из разряда "джаваскриптер сел за шарп... (с)". Про IConvertible совсем не понял, при чем тут это? Все примитивные типы поддерживают его.

Цитата Сообщение от Storm23 Посмотреть сообщение
А то, что рефлекшен будет не быстрее try/catch?
Возникновение исключения операция намного более затратная чем проход по полям типа. К тому же из примера его можно исключить если не планируется использовать типы реализующие implicit/explicit.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.02.2016, 16:00
Помогаю со студенческими работами здесь

Не работает обработка исключений Try Catch для Convert.ToInt32("123.4a")
подскажите почему не срабатывает исключение, не какой реакции почему Imports System.Exception Public Class Form1 Private...

Конструкция try catch в цикле while. Зацикливается блок catch
Здравствуйте. Столкнулся с проблемой: при попытке запихнуть в цикл конструкцию try catch - зацикливается часть, расположенная в блоке...

Catch при конвертации textBox
Здраствуйте. Есть обработчик кнопки, и в нем такой кусок кода: try { Number =...

Из TRY в CATCH при выполнении условия
Собственно в TRY находится определенное условие как сделать чтобы при его выполнении или невыполнении программа автоматически выходила на...

как сделать так, чтобы не просто выводилось сообщение об ошибке, а действие не проделывалось при при вводе значений ни о
Добрый вечер ! как сделать так, чтобы не просто выводилось сообщение об ошибке, а действие не проделывалось при при вводе значений ни от...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru