函数来返回返回函数的函数,等等

本文关键字:函数 返回 等等 | 更新日期: 2023-09-27 17:59:56

是否可以定义一个函数,使其基本上将自己作为委托返回?

例如,如果这是有效语法:

public class Scrub
{
    public NotNull NotNull<T>(T value, string name)
    {
        if (value == null) throw new ArgumentNullException(name);
        return NotNull; 
    }
}

然后我可以像这样将方法调用链接在一起。

Scrub.NotNull(param1, nameof(param1))(param2, nameof(param2)(param3, nameof(param3));

函数来返回返回函数的函数,等等

是的,您可以使用自己的委托声明:

delegate SelfReturner<T> SelfReturner<T>(T value, string name);
static SelfReturner<T> NotNull<T>(T value, string name)
{
    if (value == null) throw new ArgumentNullException(name);
    return NotNull;
}

但这对我来说似乎没有用。你真的想这么做,而不是只打三个单独的电话吗?例如,我有一个返回非null值的Preconditions.CheckNotNull——老实说,我发现它比看起来有用得多。

正如评论中所指出的,只有当所有参数都是同一类型(或都可以隐式转换为第一个参数的类型)时,上述方法才有效。允许使用进行链接的另一种方法是使用带有通用方法的singleton实例:

public sealed class NullChecker
{
    public static NullChecker Instance { get; } = new NullChecker();
    private NullChecker() {}
    public static NullChecker Scrub<T>(T value, string paramName) where T : class
    {
        if (value == null)
        {
            throw new ArgumentNullException(paramName);
        }
        return this;
    }
}

用作:

NullChecker.Instance.Scrub(param1, nameof(param1))
                    .Scrub(param2, nameof(param2))
                    .Scrub(param3, nameof(param3));

使用两个独立的方法,一个是static,另一个不是(但名称不同),可以删除Instance部分。例如:

NullChecker.Scrub(param1, nameof(param1))
           .And(param2, nameof(param2))
           .And(param3, nameof(param3));

如果您将其作为扩展方法:

public static class Scrub
{
    public static T NotNull<T, U>(this T value, U property, string name)
    {
        if (property == null) throw new ArgumentNullException(name);
        return value;
    }
}

你可以做:

test.NotNull(test.A, nameof(testA.A).NotNull(test.B, nameof(testA.B)));

不是你想要的。