Чтобы избежать лишних аллокации надо бы заменить в классе
Fn<T> readonly поля на свойства, но сложность в обратной бинарной совместимости.
PS. Смысл в том, чтобы не инициализировать все поля за раз, так как ситуация, когда все свойства класса Operators<T> используются, исчезающе мала. Поэтому вместо того, чтобы инициализировать все и сразу, делаем лениво. Как то так:
Было:
private static readonly Lazy<Func<T, T>> _unaryMinus =
new Lazy<Func<T, T>>(() => UnaryOperator<T>(ExpressionType.Negate), _lazyMode);
public static Func<T, T> UnaryMinus => _unaryMinus.Value;
...
И так все 25 свойств
Стало:
public static Func<T, T> UnaryMinus => UnaryMinusHelper.LazyValue.Value;
private static class UnaryMinusHelper
{
public static readonly Lazy<Func<T, T>> LazyValue = new Lazy<Func<T, T>>(Factory, _lazyMode);
private static Func<T, T> Factory() => UnaryOperator<T>(ExpressionType.Negate);
}
В этом случае, инициализированы будут только используемые свойства.
Так вот, такой трюк не проходит с классом Fn<T>, так как используются поля вместо свойств. Если совместимостью в этом случае можно пожертвовать, я поменяю поля на свойства, если нет — для класса Fn<T> верну как было.
Что думаете?
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>