1

我有一个参数类型为的方法

Func<Color, Double, Color> colorFunc

这很有用,因为我可以指定许多函数中的任何一个并临时发明新的函数。我的困难是,虽然几乎所有函数都需要一个额外的参数(在本例中为 Double),但有些则没有。我通过添加一个从未用于这些函数的“虚拟”可选参数解决了这个问题。

这是最好的解决方案吗?如果我有多个具有不同数量参数的函数怎么办?我应该用虚拟参数把它们都加起来吗?

4

1 回答 1

3

我建议从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);
于 2012-09-04T13:53:41.847 回答