首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#等价于java.util.function.Supplier是什么?

C#等价于java.util.function.Supplier是什么?
EN

Stack Overflow用户
提问于 2022-01-11 10:13:36
回答 3查看 858关注 0票数 3

在Java中,Supplier接口表示没有参数和泛型返回值的函数。

代码语言:javascript
复制
Supplier<String> randomPasswordSupplier = () -> "secret";
String randomPassword = randomPasswordSupplier.get();

在C#中有与此接口相当的接口吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-01-11 10:45:00

在C# (可能还有其他语言)中,这是一个delegate,委托是对具有特定参数列表和返回类型的方法的引用。

表示对具有特定参数列表和返回类型的方法的引用的类型。

您可以这样定义您自己的委托:

代码语言:javascript
复制
public delegate int Answer();

(在声明事件处理程序时经常使用)

这本身没有任何作用,但是您可以像其他任何类型一样使用它来传递对方法的引用,如下所示

代码语言:javascript
复制
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());
}

为了方便起见,.NET包括一些预定义的委托类型,即动作,它是一种没有返回值的方法(void)和任意数量的参数(最大为16),漏斗是一种具有返回类型的方法和任意数量的参数(最多为16),最后但并非最不重要的是,谓词是一种返回布尔值的方法,它只有一个参数(因此是Func<T, bool>的缩写)。

在您的例子中,您需要像这样使用Func<string>

代码语言:javascript
复制
Func<string> randomPasswordProvider = () => "sekrit";
var randomPassword = randomPasswordProvider(); // or .Invoke()

注意,在C#中,匿名方法使用fat箭头(=>)。您还可以让randomPasswordProvider指向“满胖”方法,如下所示:

代码语言:javascript
复制
string GenerateRandomPassword()
{
    return "Hello world";
}

// Note the lack of '()', we're not invoking the method, only referencing it
Func<string> randomPasswordProvider = GenerateRandomPassword;

如果您想要命名您的委托类型,您可以很容易地这样做:

代码语言:javascript
复制
public delegate string StringSupplier(); // any name you want

// or, if you want to have it generic:

public delegate T Supplier<out T>(); // the 'out' is not needed but helpful

我举了一个例子这里

然后,您也可以添加一个可拓法到您的自定义委托类型中,这样您就可以调用Get()而不是Invoke()() (但这并不是必要的,只是让它看起来更像您的Invoke()示例)

票数 2
EN

Stack Overflow用户

发布于 2022-01-11 10:22:24

任何带有“不带参数,返回delegate”签名的通用T都可以工作。

你可以定义你的:

代码语言:javascript
复制
public delegate T Supplier<out T>(); // out is not mandatory but is helpfull

或者使用标准库中声明的System.Func

要调用它,只需使用()操作符:

代码语言:javascript
复制
// Func<string> randomPasswordSupplier = () => "secret";
Supplier<string> randomPasswordSupplier = () => "secret";
stringrandomPassword = randomPasswordSupplier();
票数 1
EN

Stack Overflow用户

发布于 2022-01-11 10:22:35

正如疯狂反思在一条评论中已经指出的,在大多数情况下,相当于Func。C#并不为此使用接口,而是使用委托,这实际上是方法的签名。

您还可以创建自己的委托,执行相同的任务:

代码语言:javascript
复制
public delegate TResult Supplier<TResult>();

这将允许您包含特定的文档--例如,泛型Func委托可能会使您感到困惑。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70665003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档