Предположим, я написал такой класс (количество функций на самом деле не имеет значения, но в действительности их будет где-то около 3 или 4).
private class ReallyWeird
{
int y;
Func<double, double> f1;
Func<double, double> f2;
Func<double, double> f3;
public ReallyWeird()
{
this.y = 10;
this.f1 = (x => 25 * x + y);
this.f2 = (x => f1(x) + y * f1(x));
this.f3 = (x => Math.Log(f2(x) + f1(x)));
}
public double CalculusMaster(double x)
{
return f3(x) + f2(x);
}
}
Интересно, может ли компилятор C # оптимизировать такой код, чтобы он не проходил через многочисленные вызовы стека?
Можно ли вообще встроить делегатов во время компиляции? Если да, на каких условиях и в каких пределах? Если нет, есть ли ответ, почему?
Другой вопрос, может быть, даже более важный: будет ли он значительно медленнее, чем если бы я объявил f1, f2 and f3
как методы?
Я спрашиваю об этом, потому что хочу сохранить мой код максимально сухим, поэтому я хочу реализовать статический класс, который расширяет функциональность базового генератора случайных чисел (RNG): его методы принимают один делегат (например, из метода NextInt()
). RNG) и возвращение другого Func
делегата (например, для генерации ulong
s), построенного поверх первого. и до тех пор, пока существует множество различных ГСЧ, которые могут генерировать int
с, я предпочитаю не думать о реализации одной и той же расширенной функциональности десять раз в разных местах.
Таким образом, эта операция может выполняться несколько раз (т. Е. Начальный метод класса может быть «обернут» делегатом дважды или даже три раза). Интересно, что будет с производительностью?
Спасибо!