c# – 是否是委托类型的lambdas构造函数?

我发现当我使用lambdas作为被断言的方法的参数时,Rhino Mocks的AssertWasCalled失败.

测试:
_mockDoer.AssertWasCalled(x => x.Print(y => Console.WriteLine(“hi”)));

代码内部系统测试:
_doer.Print(y => Console.WriteLine(“hi”)));

这使得我认为lambdas是有效的代表类型的构造函数.

当我想到lambdas作为代表类型的构造函数时,我错过了什么重要吗?

解决方法

那么他们在“构造器”一词的任何正常用途中并不是真正的“构造者”.

它们是可以转换为委托类型或表达式树类型的表达式 – 后者对于进程外LINQ是至关重要的.

如果您真的在询问是否使用两个“等效”lambda表达式可以创建不相等的委托实例:是的,它是. IIRC,C#语言规范甚至呼吁,就是这样.

但是,多次使用相同的lambda表达式将不会始终创建不同的实例:

using System;

class Test
{
    static void Main(string[] args)
    {
        Action[] actions = new Action[2];
        for (int i = 0; i < 2; i++)
        {
            actions[i] = () => Console.WriteLine("Hello");
        }
        Console.WriteLine(actions[0] == actions[1]);
    }
}

在我的盒子上,实际打印True – actions [0]和action [1]具有完全相同的值 – 它们指的是同一个实例.的确,我们可以进一步:

using System;

class Test
{
    static void Main(string[] args)
    {
        object x = CreateAction();
        object y = CreateAction();
        Console.WriteLine(x == y);
    }

    static Action CreateAction()
    {
        return () => Console.WriteLine("Hello");
    }
}

再次,这打印True.不能保证,但是在这里,编译器实际上创建了一个静态字段来缓存第一次需要的代理 – 因为它不捕获任何变量.

基本上这是一个你不应该依赖的编译器实现细节.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...