Оптимизированное преобразование из TSource в TDestination с использованием INumber в .NET 9.C#

Место общения программистов C#
Ответить
Anonymous
 Оптимизированное преобразование из TSource в TDestination с использованием INumber в .NET 9.

Сообщение Anonymous »

Я работаю над методом преобразования числового значения типа TSource в другой числовой тип TDestination безопасным и оптимизированным способом. Я использую .NET 9 и общие интерфейсы INumber и IMinMaxValue, представленные в .NET.
Вот моя текущая реализация:

Код: Выделить всё

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»