iamkisly
@iamkisly
Собираю админки на dotnet и extjs

Почему в CoreCLR Int32.TryParse сделано не самым оптимальным образом?

Наткнулся на любопытный момент в исходниках CoreCLR. В простейшем листинге int.TryParse первой инструкцией идет валидация стиля, а уже потом проверка значения на null.

public static bool TryParse([NotNullWhen(true)] string? s, NumberStyles style, IFormatProvider? provider, out int result)
        {
            NumberFormatInfo.ValidateParseStyleInteger(style);

            if (s is null)
            {
                result = 0;
                return false;
            }
            return Number.TryParseBinaryInteger(s.AsSpan(), style, NumberFormatInfo.GetInstance(provider), out result) == Number.ParsingStatus.OK;
        }


Какие цели при этом приследуются, и не лучше ли перенести валидацию после проверки строки? Мы же можем сэкономить некоторое (пусть небольшое) процессорное время? Все что делает валидация стиля это проверяет соответствующие флаги
.
[MethodImpl(MethodImplOptions.AggressiveInlining)]
        internal static void ValidateParseStyleInteger(NumberStyles style)
        {
            // Check for undefined flags or using AllowHexSpecifier/AllowBinarySpecifier each with anything other than AllowLeadingWhite/AllowTrailingWhite.
            if ((style & (InvalidNumberStyles | NumberStyles.AllowHexSpecifier | NumberStyles.AllowBinarySpecifier)) != 0 &&
                (style & ~NumberStyles.HexNumber) != 0 &&
                (style & ~NumberStyles.BinaryNumber) != 0)
            {
                ThrowInvalid(style);

                static void ThrowInvalid(NumberStyles value)
                {
                    throw new ArgumentException(
                        (value & InvalidNumberStyles) != 0 ? SR.Argument_InvalidNumberStyles : SR.Arg_InvalidHexBinaryStyle,
                        nameof(style));
                }
            }
        }


Это как-то связано с атрибутом для статического анализа NotNullWhen?
  • Вопрос задан
  • 101 просмотр
Решения вопроса 1
iamkisly
@iamkisly Автор вопроса
Собираю админки на dotnet и extjs
Ответ в комментах под первым ответом
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
AshBlade
@AshBlade Куратор тега C#
Просто хочу быть счастливым
Причина 1 (расширяемость)
Если в будущем добавлять новые варианты NumberStyles, которые null должны обрабатывать иначе, либо какую-нибудь комбинацию, которая при null возвращает int.MinValue (например), то при проверке на null код сработает неправильно.

Причина 2 (контракт)
На вход всегда должны подаваться правильные данные. Очень странно, если будешь выполнять какую-либо работы с неправильными входными значениями.
Я, например, всегда валидирую данные перед тем как выполнять работу.

Причина 3 (легаси/совместимость)
Может в старых версиях (.NET Framework) было такое поведение - исключение при неправильных данных
Ответ написан
@forced
Полагаю, что атрибут попросту не допустит выполнение кода, если переданная строка будет null. Т.е этот if попросту игнорируется и выкинется NullReferenceException.
Мб сделано так для совместимости?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы