【问题标题】:C# / Lambda : object parameter explanation request (noob)C#/Lambda:对象参数解释请求(菜鸟)
【发布时间】:2009-11-23 02:43:35
【问题描述】:

这里是全新的,有一个关于这篇文章的问题:ThreadPool.QueueUserWorkItem with a lambda expression and anonymous method

具体如下:

ThreadPool.QueueUserWorkItem(
    o => test.DoWork(s1, s2)
    );

谁能解释一下'o'是什么?我可以看到(在 VS2008 中)它是一个对象参数,但我基本上不明白为什么以及如何。

【问题讨论】:

    标签: c# lambda


    【解决方案1】:

    ThreadPool.QueueUserWorkItem 需要 WaitCallback 委托作为参数。

    此委托类型对应于void 类型为Object 的一个参数的函数。

    所以,完整版的通话可能是

    ThreadPool.QueueUserWorkItem(
        new WaitCallback(delegate(object state) { test.DoWork(s1,s2); });
    );
    

    更简洁的是

    ThreadPool.QueueUserWorkItem(
        delegate(object state) { test.DoWork(s1,s2); };
    );
    

    使用 C# 3.0 语法,我们可以将其写成更短的形式:

    ThreadPool.QueueUserWorkItem(
        (object state) => { test.DoWork(s1,s2); };
    );
    

    C# 3.0 lambda 语法允许省略 state 的类型。由于这个参数并不是真正需要的,它也被缩写为其类型的第一个字母。

    【讨论】:

      【解决方案2】:

      QueueUserWorkItemdocumentation 来看,第一个参数是WaitCallback,其定义如下:

      public delegate void WaitCallback(
          Object state
      )
      

      状态的定义是:

       Type: System.Object
       An object containing information to be used by the callback method.
      

      所以QueueUserWorkItem 的第一个参数是一个函数,它接受一个对象(一个可选的用户状态)并执行一些返回 void 的操作。在您的代码中, o 是用户状态对象。在这种情况下不使用它,但它必须存在。

      【讨论】:

        【解决方案3】:

        只是look it upo 是一个状态对象,您可以使用QueueUserWorkItem 的重载版本将其传递给执行的方法。当你没有明确传递一个时,它是null

        这种方式在没有可用的 lambda 表达式时很有用。

        【讨论】:

        • 我认为 OP 正在寻找的是对 lambda 表达式的简单英文解释。
        【解决方案4】:

        o 是 lambda 函数的形式参数。其类型由QueueUserWorkItem的参数类型派生而来。

        【讨论】:

          【解决方案5】:

          其他答案很好,但如果您在不使用 lambda 表达式或委托方法(即使用 .NET 1 方式)的情况下看到什么是等效的,也许会有所帮助:

          void SomeMethod()
          {
            //...
            ThreadPool.QueueUserWorkItem(new WaitCallback(TheCallback));
            //...
          }
          
          void TheCallback(object o)
          {
            test.DoWork(s1, s2);
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-02-14
            • 1970-01-01
            • 2017-01-11
            • 1970-01-01
            • 2018-09-13
            • 2012-05-02
            • 1970-01-01
            相关资源
            最近更新 更多