Перегрузки методов для числовых параметров
Имеем скажем любой метод, который что-то считает по поступающим числам. Но применяет одинаковую формулу.
Все советуют делать для каждого нужного типа свою перегрузку. Но формулу-то что, каждый раз заново писать для всех перегрузок?
Менее распространённые советы - писать формулу лишь для варианта с double или decimal, а в остальных перегрузках вызывать один из первых вариантов с приведением типов параметров. Но ведь тут мы теряем в точности мантиссы? Плюём на это и смиряемся?
Они просто повторяют формулы. И тесты похоже тоже пишут оданиковые под копирку, только с другими типами. Или у них этот код вообще по шаблону генерится, включая тесты.
Разве что этот атрибут добавляют, чтобы наверняка
[MethodImpl(MethodImplOptions.AggressiveInlining)]
Но формулу-то что, каждый раз заново писать для всех перегрузок?Ну генерик можно сделать
А это чем не нравится?
using System.Numerics; public static T AddNumbers<T>(T a, T b) where T : INumber<T> { return a + b; }
Это новьё и не везде работает. Время пройдёт, тогда посмотрим.
И это не то, по-моему. Какая-то возня с функциями, вместо того, чтобы как раньше писать a + b / c * d - e.
Ещё раз гляньте мою ссылку - сами дотнетовцы в своих исходниках тупо копипастят код, который семантически выглядит одинаково, а внутри операторы для каждого типа переопределены.
ну если .нет 7 новьё
По старому, тоже должно работать
public static T Add<T>(T a, T b) { dynamic x = a; dynamic y = b; return x + y; }
.
сами дотнетовцы
А кто мешает сделать тоже самое? Вариантов не так уж и много
Так уж решили, тут этого дофига
https://learn.microsoft.com/en-us/dotnet/api/system.numeri...
А хотелось небось T: int ?
сами дотнетовцыА кто мешает сделать тоже самое? Вариантов не так уж и много
По-моему эта фигня с пачками интерфейсов не для интенсивных вычислений придумана.
А хотелось небось T: int ?
Хотелось T: int, double, float
И писать T a = b + c * d / e;
Всё равно все эти действия для указанных чисел определены, так что один код для всех должен быть. Копипастить вручную или генерацией, а потом везде прописывать "интерсивный инлайнинг" - какой-то лютый костыль из-за несовершенства архитектуры языка. Хотя инлайнинг похоже по другой причине прописан, но копипастинг-то остаётся.
| Method | Mean | Error | StdDev | |---------------- |-----------:|---------:|---------:| | AddNumbers | 244.7 ns | 3.52 ns | 2.94 ns | | AddInt | 243.1 ns | 1.94 ns | 1.81 ns | | SubtractNumbers | 243.1 ns | 2.98 ns | 2.79 ns | | SubtractInt | 250.6 ns | 5.00 ns | 7.93 ns | | MultiplyNumbers | 249.3 ns | 5.00 ns | 7.18 ns | | MultiplyInt | 246.3 ns | 2.88 ns | 2.56 ns | | DivideNumbers | 1,910.2 ns | 22.21 ns | 20.77 ns | | DivideInt | 1,890.8 ns | 9.41 ns | 8.34 ns |
Это вы как такую табличку получили? Скопировали откуда-то?
у меня ломается моск от вот этого
T : INumber<T>
Это много где встречается. Например
public abstract class PointerEventBase<T> where T : PointerEventBase<T>, new() public sealed class ClickEvent : PointerEventBase<ClickEvent>
Найдите справочник по мате в Сингапуре, и можете визуализировать сколько угодно.
Это вы как такую табличку получили?
С пацанами правильными нужно дружить, а не кидаться по ним грязью
Могу проект выложить, если интересует.
Интересовала прежде всего грубая оценка производительности.
С пацанами правильными нужно дружить, а не кидаться по ним грязью
Могу проект выложить, если интересует.
Да не надо проект - достаточно вас, который делится тут инфой от "правильных пацаноф". )))