Конечно пример надуманный, в реальной жизни вы вряд ли кто-то будет тестировать репозиторий, но вместо его может быть, например, получение курсов валют из сети. Цель статьи - показать проблемы и возможные способы их решения.
Никто не будет приводить сложный код для того, чтобы объяснить проблему. Пример должен уместиться в голове и быть простым для понимания и понятен каждому. Каждый в своём коде использует репозиторий и пример на нём банально нагляден.
1)Это не решит проблему банальной невнимательности.
2)А также не решит проблему, если существует несколько solution и человек не знает о них/забыл и не добавил логику. Узнать об этом можно будет только во время исполнения.
Полностью поддерживаю. Но к великому сожалению, далеко не все могут использовать новую версию NET. Бывают легаси проекты, где приходится жить с тем, что есть.
Вариант return (T)(i32Left + i32Right) не компилируется — нет гарантии, что T это int (хоть мы-то знаем, что это так). Можно попробовать двойное преобразование return (T)(object)(i32Left + i32Right). Сначала сумма упаковывается, затем — распаковывается в T. Это будет работать только если типы до упаковки и после упаковки совпадают.
Вы не правы. В Net очень известный трюк с проверкой generic тип. Результат бенчмарка
Исходный код:
Исходный код
[MethodImpl(MethodImplOptions.NoInlining)]
private static T ThrowInvalidOperation<T>() => throw new InvalidOperationException("Not support type");
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static T Add<T>(T lft, T rgt) where T : struct
{
if(typeof(T) == typeof(int))
return (T)(object)((int)(object)lft + (int)(object)rgt);
if(typeof(T) == typeof(float))
return (T)(object)((float)(object)lft + (float)(object)rgt);
if(typeof(T) == typeof(decimal))
return (T)(object)((decimal)(object)lft + (decimal)(object)rgt);
if(typeof(T) == typeof(double))
return (T)(object)((double)(object)lft + (double)(object)rgt);
return ThrowInvalidOperation<T>();
}
[Benchmark]
public int GenericAdd() => Add(10, 20);
[Benchmark]
public int DirectAdd() => 10 + 20;
В данном случае generic оказался быстрее, но это всё в пределах погрешности.
И Вас с праздником.
Согласен, лучше было бы в тесте написать код для удаления файла, а не менять public api
Конечно пример надуманный, в реальной жизни вы вряд ли кто-то будет тестировать репозиторий, но вместо его может быть, например, получение курсов валют из сети. Цель статьи - показать проблемы и возможные способы их решения.
Никто не будет приводить сложный код для того, чтобы объяснить проблему. Пример должен уместиться в голове и быть простым для понимания и понятен каждому. Каждый в своём коде использует репозиторий и пример на нём банально нагляден.
Это легко можно решит используя IDisposable
Сам тест
А в чём противоречие?
В OrderBy может быть любой объект, для сортировки будет использоваться IComparer, по умолчанию Comparer<TKey>.Default.
Т.е у ValueTuple реализован интерфейс сравнения и будет использоваться это сравнение объектов.
Можно даже в один OrderBy)
github.com/blowin/Blowin.Required
2)А также не решит проблему, если существует несколько solution и человек не знает о них/забыл и не добавил логику. Узнать об этом можно будет только во время исполнения.
С таким подходом, проект просто не соберется
Вы не правы. В Net очень известный трюк с проверкой generic тип. Результат бенчмарка
Исходный код:
В данном случае generic оказался быстрее, но это всё в пределах погрешности.