【问题标题】:What is the return _ in C#C# 中的返回 _ 是什么
【发布时间】:2015-08-29 20:33:58
【问题描述】:

我有一个关于我以前在 C# 中从未见过的东西的问题。在新的asp.net依赖注入中的服务提供者中,有一个带有return _ => null;的方法

https://github.com/aspnet/DependencyInjection/blob/dev/src/Microsoft.Framework.DependencyInjection/ServiceProvider.cs 第 63-72 行。

有问题的方法:

private Func<MyServiceProvider, object> CreateServiceAccessor(Type serviceType)
{
    var callSite = GetServiceCallSite(serviceType, new HashSet<Type>());
    if (callSite != null)
    {
        return RealizeService(_table, serviceType, callSite);
    }
    return _ => null;
}

_ 是什么?它是 C# 6 中的新功能吗?搜索return _ 不会返回任何有用的信息,除非您需要命名约定。

【问题讨论】:

  • 这是你的 Func 参数的名称
  • return delegate (int _) { return null; }; 相同,其中_ 是未使用的参数(因此无需提供正确名称)。

标签: c# asp.net


【解决方案1】:

如果您没有在 lambda 中使用该参数,人们会使用 _ 作为表示该参数的约定。

在您的代码中,如果serviceType 未解析为调用站点,则这是一个包罗万象的情况。由于您不关心 serviceType 是否返回 null,因此 _ 用于该参数。

这可能是这篇包含大量信息的帖子的副本:

C# style: Lambdas, _ => or x =>?

【讨论】:

  • 感谢您提供更多详细信息的链接。现在有意义了,只是一个变量名。我在想它有什么特殊含义,因为这是我第一次看到像这样单独使用下划线。
【解决方案2】:

_ 是一个有效的 C# 标识符,因此 _ =&gt; nullmyServiceProvider =&gt; null 相同

定义什么是有效标识符并不像检查允许字符的白名单那样简单,但它已记录在 here

【讨论】:

    【解决方案3】:

    从 C#7 开始,语言(或者更确切地说是编译器)识别单个 _ 表示不重要值的约定:https://docs.microsoft.com/en-us/dotnet/csharp/discards

    从 C# 7.0 开始,C# 支持丢弃,这是在应用程序代码中有意使用的临时虚拟变量。丢弃相当于未赋值的变量;它们没有价值。因为只有一个丢弃变量,并且该变量甚至可能没有分配存储空间,所以丢弃可以减少内存分配。因为它们使代码的意图清晰,所以它们增强了代码的可读性和可维护性。

    您通过将下划线 (_) 指定为变量作为其名称来表明该变量是废弃的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-11
      • 2020-10-17
      • 1970-01-01
      相关资源
      最近更新 更多