C#:有没有办法通过指定额外参数的值来 "trim" 一个函数来适应委托?
C#: Is there any way to "trim" a function to fit into a delegate by specifying the values of extra arguments?
我正在从事一个经常通过委托将函数作为参数传递的项目。
示例:
delegate double MathFunction(double x);
void render_function(double x0, double x1, double x_interval, MathFunction f)
{...}
我 运行 遇到的一个常见情况是想要传递一个具有附加参数的函数,我希望每次在 render_function 中调用它时它都有一个常量值。但我不想只删除参数并将它们替换为常量,因为我多次调用 render_function 并为这些参数设置不同的值。
我想做的事情的例子:
double sin_wave(double x, double frequency, double magnitude) {...}
render_function(x0, x1, x_interval, sin_wave(frequency: 3, magnitude: 0.5));
render_function(x0, x1, x_interval, sin_wave(frequency: 2, magnitude: 1.5));
我想到了几个解决方案:
- 构建参数数组系统,例如使用 params
- 将需要额外参数的函数包装在一个对象中,使用对象的状态来控制额外参数的值。
但我觉得这两个都不雅观。有没有更清洁的解决方案?
您可以将其包装在 lambda 中:
render_function(x0, x1, x_interval, x => sin_wave(x, frequency: 3, magnitude: 0.5));
如果您不介意手写所有内容,直接的方法是定义一个 class 实例来保存缓存的参数并为您调用该方法;
public class Sin {
private readonly double frequency;
private readonly double magnitude;
public Sin(double frequency, double magnitude) {
this.frequency = frequency;
this.magnitude = magnitude;
}
public double Call(double x) => sin_wave(x, frequency, magnitude);
}
MathFunction func = new Sin(3, ...).Call;
但是您可以让 C# 编译器为您构建与上述等同的东西;
MathFunction func = Sin(double frequency, double magnitude)
=> (x) => sin_wave(x, frequency, magnitude);
或者直接构建委托;
MathFunction func = (x) => sin_wave(x, 3, 0.5);
我正在从事一个经常通过委托将函数作为参数传递的项目。 示例:
delegate double MathFunction(double x);
void render_function(double x0, double x1, double x_interval, MathFunction f)
{...}
我 运行 遇到的一个常见情况是想要传递一个具有附加参数的函数,我希望每次在 render_function 中调用它时它都有一个常量值。但我不想只删除参数并将它们替换为常量,因为我多次调用 render_function 并为这些参数设置不同的值。
我想做的事情的例子:
double sin_wave(double x, double frequency, double magnitude) {...}
render_function(x0, x1, x_interval, sin_wave(frequency: 3, magnitude: 0.5));
render_function(x0, x1, x_interval, sin_wave(frequency: 2, magnitude: 1.5));
我想到了几个解决方案:
- 构建参数数组系统,例如使用 params
- 将需要额外参数的函数包装在一个对象中,使用对象的状态来控制额外参数的值。
但我觉得这两个都不雅观。有没有更清洁的解决方案?
您可以将其包装在 lambda 中:
render_function(x0, x1, x_interval, x => sin_wave(x, frequency: 3, magnitude: 0.5));
如果您不介意手写所有内容,直接的方法是定义一个 class 实例来保存缓存的参数并为您调用该方法;
public class Sin {
private readonly double frequency;
private readonly double magnitude;
public Sin(double frequency, double magnitude) {
this.frequency = frequency;
this.magnitude = magnitude;
}
public double Call(double x) => sin_wave(x, frequency, magnitude);
}
MathFunction func = new Sin(3, ...).Call;
但是您可以让 C# 编译器为您构建与上述等同的东西;
MathFunction func = Sin(double frequency, double magnitude)
=> (x) => sin_wave(x, frequency, magnitude);
或者直接构建委托;
MathFunction func = (x) => sin_wave(x, 3, 0.5);