Вот моя текущая реализация:
Код: Выделить всё
public static TDestination ToNumberOrDefault(this TSource number, TDestination defaultValue)
where TSource : struct, INumber, IMinMaxValue
where TDestination : struct, INumber, IMinMaxValue
{
try
{
return TDestination.CreateChecked(number);
}
catch
{
return defaultValue;
}
}
Проблема с производительностью: метод CreateChecked преобразует исходное значение в объект внутри системы перед выполнением преобразования, что приводит к накладным расходам на упаковку и распаковку, что делает его менее оптимальным.Частое использование: этот метод часто вызывается в путях кода, критичных к производительности, поэтому я ищу более быструю альтернативу.
Код из Int32.cs в качестве Пример:
Код: Выделить всё
else if (typeof(TOther) == typeof(long))
{
long actualValue = (long)(object)value;
result = checked((int)actualValue);
return true;
}
Есть ли более оптимизированный способ выполнить это преобразование типов между TSource и TDestination, гарантируя, что значение попадает в допустимый диапазон TDestination?
Могу ли я избегать блока try/catch и CreateChecked, при этом обеспечивая безопасное преобразование значения или возврат к значению по умолчанию, если оно недействительно?
Есть ли в .NET 9 альтернативные API или шаблоны, которые больше подходят для этого тип числового преобразования.
Ограничения:
TSource и TDestination гарантированно реализуют INumber и IMinMaxValue.
Мне нужно убедиться, что значение TSource находится в пределах диапазона определяется TDestination.MinValue и TDestination.MaxValue перед выполнением преобразования.
Пример использования:
Код: Выделить всё
var sourceValue = 12345;
var result = sourceValue.ToNumberOrDefault(default(short)); // Should return short value or fallback to default
Использование CreateChecked: работает, но вызывает проблемы с производительностью из-за упаковки/распаковки.
Использование Convert.ChangeType: аналогичная проблема с упаковкой/распаковкой и потенциальные накладные расходы.
Ручное преобразование в промежуточный тип (например, двойной или десятичный) для проверки диапазона: добавляет сложности и потенциальных проблем с точностью.
Подробнее здесь: https://stackoverflow.com/questions/792 ... t-in-net-9
Мобильная версия