C # Неудачная попытка перехвата очень медленно в Visual Studio IDE - PullRequest
0 голосов
/ 22 мая 2018

Кто-нибудь знает, как решить следующую проблему:

Иногда вам нужно использовать блок Try-Catch, чтобы посмотреть, можно ли преобразовать значение в ожидаемый тип.Например, если вы не знаете, что исходное значение является строкой, вы не можете просто использовать TryParse.

К сожалению, я только что обнаружил причуду Visual Studio IDE, которая усложняет жизнь.

Чтобы увидеть это, создайте проект Winforms и добавьте следующий код в загрузку формы:

        private void Form1_Load(object sender, EventArgs e)
    {
        Stopwatch stopWatch = new Stopwatch(); stopWatch.Start();
        int numTries = 1000;

        object obj = "";
        for (int i = 0; i < numTries; i++)
        {
            try
            {
                int val = (int)obj;
            }
            catch (System.InvalidCastException)
            {
            }
        }

        TimeSpan ts = stopWatch.Elapsed;
        string elapsedTime = $"{numTries} failed try-catch took a time of {ts.Hours:00}:{ts.Minutes:00}:{ts.Seconds:00}";

        MessageBox.Show(elapsedTime);
    }

Когда я запускаю это в моей среде IDE, код обрабатывает 1000 секунднеудачные блоки try-catch.Напротив, если я запускаю отладочную версию за пределами IDE, время, которое требуется, слишком мало, чтобы даже зарегистрироваться.Это проблема для отладки кода редактора, над которым я работаю.

Я использую Visual Studio 2017 Enterprise, версия 15.4.0, .NET Framework 4.7.02046

1 Ответ

0 голосов
/ 22 мая 2018

Проблема с использованием Visual Studio, скорее всего, заключается в анализе отладки.Исключения очень дороги в обработке, и даже больше, если к ним подключена IDE.

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

Если вы не увереныкакой тип данных вы можете улучшить, предварительно проверив его тип.

if (obj is int i)
{
    // use i
}
else
{
    string s = obj.ToString();

    if (int.TryParse(s, out int val))
    {
        // use val
    }
    else
    {
        // your exception case
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...