为什么要使用Func <string>而不是string? - c#

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

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

有问题的行是22:

    private static Func<string> getToken = () => Environment.GetEnvironmentVariable("GitHubToken", EnvironmentVariableTarget.Process);

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

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

参考方案

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

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

无法从ArrayList <String>转换为List <Comparable> - java

当我写下面的代码时,编译器说 无法从ArrayList<String>转换为List<Comparable>private List<Comparable> get(){ return new ArrayList<String>(); } 但是当我用通配符编写返回类型时,代码会编译。private List&l…

为什么我的List <string>没有从$ ajax调用的MVC控制器返回 - javascript

我正在尝试使用ajax调用在cshtml文件中创建定制列表.ajax({ type: "GET", cache: false, url: "@Url.Action("getValidationLists")", contentType: "application/json", d…

将谓词<T>转换为Func <T,bool> - c#

我有一个包含成员Predicate的类,希望在Linq表达式中使用该类:using System.Linq; class MyClass { public bool DoAllHaveSomeProperty() { return m_instrumentList.All(m_filterExpression); } private IEnumerable&…

合并List <T>和List <Optional <T >> - java

鉴于: List<Integer> integers = new ArrayList<>(Arrays.asList( 10, 12 )); List<Optional<Integer>> optionalIntegers = Arrays.asList( Optional.of(5), Optional.em…

OpenShift构建错误:无法在多模块Maven Spring启动项目的父模块中导入子模块类 - java

我有一个使用spring的多模块Maven项目。通用模块类用作业务模块项目中的直接导入。我可以在本地PC上编译并成功运行它们。当我在OpenShift中部署相同的模块时,出现错误,无法在业务模块中导入通用模块类。项目结构可以总结如下:项目根 通用模块 src pom.xml 业务模块 src pom.xml pom.xml父POM:<?xml vers…