gpt4 book ai didi

c# - 函数返回一个函数,返回一个函数等

转载 作者:太空狗 更新时间:2023-10-29 22:11:50 25 4
gpt4 key购买 nike

是否有可能以一种基本上将自身作为委托(delegate)返回的方式定义一个函数?

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

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)声明:

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;
}

...但它对我来说似乎没有用。您真的有什么理由要这样做,而不是仅仅进行三个单独的调用?例如,我有一个返回非空值的 Preconditions.CheckNotNull - 老实说,我发现它比看起来更有用。

如注释中所述,以上仅在所有参数都属于同一类型(或所有参数都可隐式转换为第一个参数的类型)时才有效。允许链接更多工作的替代方法是使用具有通用方法的单例实例:

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));

使用两种不同的方法,一种是静态的,另一种不是(但名称不同),您可以删除 Instance 部分。例如:

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

关于c# - 函数返回一个函数,返回一个函数等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38730855/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com