在Java中,Supplier接口代表一个没有参数和通用返回值的函数。
Supplier<String> randomPasswordSupplier = () -> "secret";
String randomPassword = randomPasswordSupplier.get();
Run Code Online (Sandbox Code Playgroud)
C# 中是否有与此接口等效的接口?
在 C#(也可能是其他语言)中,这是 a delegate,委托是对具有特定参数列表和返回类型的方法的引用
表示对具有特定参数列表和返回类型的方法的引用的类型
您可以像这样定义自己的委托:
public delegate int Answer();
Run Code Online (Sandbox Code Playgroud)
(这在声明事件处理程序时经常使用)
单独使用它不会执行任何操作,但是您可以像任何其他类型一样使用它来传递对方法的引用,如下所示
public delegate int Answer();
Run Code Online (Sandbox Code Playgroud)
为了方便起见,.NET 包含一些预定义的委托类型,即Action,它是一种没有返回值 (void) 和任意数量的参数(最多 16)的方法,Func是一种具有返回类型和任意数量的参数的方法(最多 16 个)最后但并非最不重要的谓词是一种返回布尔值并且只有一个参数的方法(因此简写为Func<T, bool>)
在您的情况下,您需要Func<string>像这样使用:
public void PrintAnswer(Answer theAnswer)
{
Console.WriteLine(theAnswer());
// If 'theAnswer' can be null, then you can check for it normally, or use the Invoke method like so
Console.WriteLine(theAnswer?.Invoke());
}
Run Code Online (Sandbox Code Playgroud)
=>请注意,在 C# 中,我们对匿名方法使用粗箭头 ( )。您还可以指出randomPasswordProvider“全脂”方法,如下所示:
string GenerateRandomPassword()
{
return "Hello world";
}
// Note the lack of '()', we're not invoking the method, only referencing it
Func<string> randomPasswordProvider = GenerateRandomPassword;
Run Code Online (Sandbox Code Playgroud)
如果你想命名你的委托类型,你可以轻松地这样做:
Func<string> randomPasswordProvider = () => "sekrit";
var randomPassword = randomPasswordProvider(); // or .Invoke()
Run Code Online (Sandbox Code Playgroud)
我在这里举了一个例子
然后,您还可以添加一个扩展方法到您的自定义委托类型,以便您可以调用Get()而不是调用Invoke()或只是()调用(但这确实没有必要,只是让它看起来更像您的 Java 示例)