繁体   English   中英

使用Lambda表达式作为参数

[英]Use of Lambda Expression as parameter

我读了一段代码并感到困惑。 它来自一个类的方法:

public ResponseType Cancel(RequestType request)
{
    return Processor.Execute<RequestType , ResponseType>(
        context =>
        {
            Services.Cancel(Convertor.ToBusiness(request,  context.GetUid()));
        },
        request);
}

首先,我不知道如何在Lambda表达式的上下文中过去了。我的意思是,在上下文的来源。 Cancel(RequestType请求)方法的参数列表未提供该参数。 Processor类提供Execute实现的形式为:

public static class Processor
{
   public static TResponse Execute<TRequest, TResponse>(ProcessProc proc, TRequest request)
          where TRequest : class
          where TResponse : class{......}

   //Processor::ProcessProc is a delegate:
   public delegate object ProcessProc(ServiceContext context); 
}

其次,我不知道where TRequest:class的好处,我检查了msdn文档, 其中where-class是要确保TRequest为引用类型,对吗?

感谢亚历克斯。 虽然还有些不明白的地方:对于TRequest:类 :在哪里 :如果我在编写这段代码,则不会知道添加此where-class 如果传入了错误类型的参数,编译器会为我相信的抱怨。 那么使用它是什么意思呢?
似乎上下文隐藏在我不知道的地方。 我验证了该类Processor的定义,该定义没有从任何其他类继承,仅包含几个方法和两个委托定义,没有其他数据或属性。 该代码可以编译并成功运行。 我确实怀疑引入Lambda-ex作为参数的可读性。 理解应该使用哪一个作为上下文参数是不明确的,编译器如何找出来? 以下是我在msdn上找到的示例:ex1:

delegate int del(int i);
static void Main(string[] args)
{
    del myDelegate = x => x * x;
    int j = myDelegate(5); //x=5, easy to understand
}

例2:

int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
int oddNumbers = numbers.Count(n => n % 2 == 1);

ex2不像ex1那样简单明了,对于从c ++转移过来的我来说,可读性要差一些。

补充:是否有可能来自RequestType请求上下文 RequestType是一个很大的局部类,很难找到完整的定义。

我发现最后分配了上下文的位置,在ProcessProc工厂的实现中非常深入,在那里执行了委托,并且上下文获得了一个值。 我没有深入研究委托的执行方式。 因此,该线程没有太大价值。 任何人都不看所有代码就几乎不可能猜出答案。 还是非常感谢大家。

没错,类意味着您不能将值类型(结构)用作通用参数。 上下文是变量,它在lambda中是封闭的,并且是参数,Execute在其实现中用于调用您的lambda。 这意味着Execute接受lambda并将其用于封装在类Processor中的某个对象。 我认为,处理器存储了一些业务上下文,而您执行将取消与您的某些请求参数关联的上下文(GUID认为)。

为了更清晰地了解Processor类的静态Execute函数的第一个参数,您可以看到参数类型ProcessProc是使用ServiceContext并返回对象的委托。 您可以通过多种方式传递委托来进行诸如此类的编码。 第一种形式(可能是最常用的形式)是在类中定义一个与委托签名匹配的方法,然后将该函数作为第一个参数传入,例如:

public object MyProcessProc(ServiceContext context)
{
  // Do something
  return null;
}

第二种方法如示例中所示,将匿名委托(lambda)作为第一个参数传递给函数。 在这种情况下,lambda语法要求在“ =>”的左侧指定委托的参数,但不必将其命名为相同的名称。 开发人员可以像委托一样轻松地使用以下内容:

purple =>
{
  Services.Cancel(Convertor.ToBusiness(request,  purple.GetUid()));
}

虽然可读性会受到影响。

希望可以帮助我们了解一些情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM