【问题标题】:(_) => DoWork(); How an underscore is valid as a anonymous delegate parameter?(_) => DoWork();下划线如何作为匿名委托参数有效?
【发布时间】:2025-03-22 16:25:02
【问题描述】:

excellent answer about starting a timer immediately 中,我可以看到以下代码:

    timer.Elapsed += timer_Elapsed;
    ThreadPool.QueueUserWorkItem((_) => DoWork());
...

void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) {
    DoWork();
}

void DoWork() {
    // etc...
}

我自己试了一下,碰到了这一行,我还以为匿名委托构造有错字:

                                What?
                                  |
                                  V
    ThreadPool.QueueUserWorkItem((_) => DoWork());

哪条隐藏规则使下划线“_”可接受作为匿名委托中的参数名称?

【问题讨论】:

  • 在一般情况下使单个下划线可接受作为参数名称的相同规则? _ 是 C# 中的有效标识符。
  • 我不知道,我很惊讶...感谢您指出这一点。
  • 我想标记为 this 的副本,但我不想 Mjolnir,所以这是我的投票。

标签: c# delegates anonymous-methods


【解决方案1】:

下划线是 C# 中的普通标识符字符。例如my_money 是有效的。所以_x 一样有效。

你也可以写_ => DoWork(),我认为这更常见。

【讨论】:

  • 另外值得注意的是,从概念上讲,下划线表示它所代表的参数没有在内部函数中使用,但需要提供以满足编译器的要求。基本上是“别介意我”的简写方式。
  • TIL _ 是一个有效的变量名