为什么要使用 Func<string> 而不仅仅是 string?

l--*_*''' 5 .net c# azure-functions

为什么要使用Func<string> 而不仅仅是 string

我的问题特别是关于这个回购。

有问题的行是 22:

    private static Func<string> getToken = () => Environment.GetEnvironmentVariable("GitHubToken", EnvironmentVariableTarget.Process);
Run Code Online (Sandbox Code Playgroud)

getToken封装一个没有参数的方法并返回一个string. 不简单地将此变量键入为字符串的原因是什么?

为什么要使用Func<string> 而不仅仅是 string

Joe*_*orn 5

我可以看到人们可能会这样做的五个原因:

  1. 当您希望允许的值不仅会随时间变化(您仍然可以使用属性来实现!),而且您需要检查以找到它的位置可能会发生变化时。例如,默认情况下您会检查一个环境变量,但是在某处有一个用户选项可以查看配置文件、Web 服务或数据库表等。现在您可以交换函数调用,而不是检查它每次在必须知道如何执行所有这些操作的函数中使用 config 选项。
  2. 这使得在async上下文中使用它变得更加容易,您可以在其中等待结果。您可以直接在任务中等待函数,而不必将属性包装为可等待方法。
  3. 他们想要函数语义而不是属性语义。这是一个选择,他们希望将函数调用呈现为类型的公共 API,而不是属性。那么,lambda(实际上:表达式主体成员)只是编写方法的一种更短的方法。
  4. 这是在 C# 8 中新的默认接口实现之前编写的,其中代码提供了默认实现,但实际上希望您“覆盖”它并用您自己的方法替换该方法,该方法可以查看您需要的任何值。或者,即使他们使用的是 C# 8,额外的接口也被认为不值得付出努力。
  5. 在依赖注入场景中更改实现更容易,但希望有人这样做使用接口。通常,您注入整个类型,而不是单个方法。


ger*_*rmi 1

通常,如果函数产生的值在程序执行期间可能发生变化,则可以使用 aFunc<T>来代替。T

它对于 DI 场景也很有用,在这种场景中,函数的使用者不关心(或不应该知道,...)值来自哪里。它只需要能够生成当前正确的即可。

但在你的例子中似乎并非如此。在那里,你可以得到private static string token = ...相同的结果。