我有一个参数类型为的方法
Func<Color, Double, Color> colorFunc
这很有用,因为我可以指定许多函数中的任何一个并临时发明新的函数。我的困难是,虽然几乎所有函数都需要一个额外的参数(在本例中为 Double),但有些则没有。我通过添加一个从未用于这些函数的“虚拟”可选参数解决了这个问题。
这是最好的解决方案吗?如果我有多个具有不同数量参数的函数怎么办?我应该用虚拟参数把它们都加起来吗?
我有一个参数类型为的方法
Func<Color, Double, Color> colorFunc
这很有用,因为我可以指定许多函数中的任何一个并临时发明新的函数。我的困难是,虽然几乎所有函数都需要一个额外的参数(在本例中为 Double),但有些则没有。我通过添加一个从未用于这些函数的“虚拟”可选参数解决了这个问题。
这是最好的解决方案吗?如果我有多个具有不同数量参数的函数怎么办?我应该用虚拟参数把它们都加起来吗?
我建议从Func<t>
委托转移到自定义委托类型,在这种情况下,有几个原因。
一、默认值
public delegate Color HerpinateColor(Color initial, double count = double.NaN);
您可以识别可选参数并设置它们的默认值。但是,如果默认值是传入的值,该怎么办?这给我带来了第二个好处,文档!
/// <summary>
/// A method to reherpinate colors or something lol
/// </summary>
/// <param name="initial">An initial value for the <see cref="Color"/>
/// to apply the reherpenation algorithm on.</param>
/// <param name="count">(optional)The average herp of the derp.</param>
/// <returns>A reherpenated <see cref="Color"/></returns>
/// <remarks>Implementations should avoid fooing the bar if <paramref name="count"/>
/// is <see cref="double.NaN"/>.</remarks>
public delegate Color HerpinateColor(Color initial, double count = double.NaN);
可以记录自定义代表。哦,当然,你可以把它塞进你的方法签名中,但它不会出现在智能感知中(或者会受到严重限制)。
Funcs/actions 非常有用,但是使用自定义委托仍然比它们有一些优势。
哦,你仍然可以使用 lambda,这意味着你的 API 仍然对实现者有同样的感觉。
HerpinateColor derp = (initial, count) => double.IsNaN(count) ?
Color.Multiply(initial, .5f) :
Color.Multiply(initial, (float)count);