在C#(以及其他语言中),这是一个
delegate
,委托是对具有特定参数列表和返回类型的方法的引用。
代表引用具有特定参数列表和返回类型的方法的类型
您可以像这样定义自己的委托:
public delegate int Answer();
(这通常用于声明事件处理程序)
单独使用它并没有什么作用,但您可以像使用其他类型一样使用它来传递方法的引用,例如:
public void PrintAnswer(Answer theAnswer)
{
Console.WriteLine(theAnswer());
Console.WriteLine(theAnswer?.Invoke());
}
为了方便起见,.NET包括一些预定义的委托类型,即
Action,它是一个没有返回值(void)和任意数量参数(最多16个)的方法,
Func,它是一个带有返回类型和任意数量参数(最多16个)的方法,最后
Predicate,它是一个返回布尔值并且只有一个参数的方法(因此是
Func<T, bool>
的简写)。
在您的情况下,您将需要使用
Func<string>
,如下所示:
Func<string> randomPasswordProvider = () => "sekrit";
var randomPassword = randomPasswordProvider();
请注意,在C#中,我们使用一个“胖箭头”(
=>
)表示匿名方法。您也可以将
randomPasswordProvider
指向一个“完整的胖方法”,如下所示:
string GenerateRandomPassword()
{
return "Hello world";
}
// Note the lack of '()', we're not invoking the method, only referencing it
Func<string> randomPasswordProvider = GenerateRandomPassword;
如果你想为你的委托类型取名,你可以像下面这样轻松地完成:
public delegate string StringSupplier();
public delegate T Supplier<out T>();
我做了一个例子
在这里。
你可以为自定义委托类型添加
扩展方法,这样你就可以调用
Get()
而不是
Invoke()
或
()
(但这并不是必需的,只是让它看起来更像你的Java示例)。
Func<TResult>
是一个泛型委托类型,它不接受参数并返回一个指定类型的结果。在.NET框架中广泛使用。 - madreflection