在开始介绍今天要讲的常识之前,我们想要理解严格求值计谋和非严格求值计谋之间的区别,这样我们才华够深有体会的大白为什么需要操作这个技术。首先需要说明的是C#语言小部分给与了非严格求值计谋,,大部分还是严格求值计谋。首先我们先演示非严格求值计谋的情况,我们先在控制台项目中写一个DoOneThing要领。
然后在Main要领中写入下面这串代码:
然后我们运行措施,会发明DoOneThing要领并没有执行。固然这看起来也很正常,因为这是或,并且第一个已经是true了。整个表达式就是true了,自然第二个就无需求值了。但是这恰恰就长短严格求值的计谋,如果是严格求值计谋的话整个表达式城市计算。接着就是严格求值计谋的情况了,这个相信很多人城市立马大白,首先我们需要再写一个DoSomeThing要领:
接着改削Main要领:
执行之后我们可以看到如下的功效:
但是我们可以清楚的看到a的值是false,根柢不会使用b值,但是通报参数的时候已经将DoOneThing要领执行并赋值给b,假设这个要领是一个非常耗时的操纵。那么我们就会白白浪费失这段时间,最后求得的值也没有使用的到。而这正是严格求值计谋,现在天的主要方针就是转变这种情况,能够在我们确定需要某个值的时候才计算。下面我们就可以开始改革这个要领,让其能够撑持惰性求值。首先我们改削DoSomeThing要领:
这里我们将参数类型都改成了函数,这样将要通报进来的参数都改酿成函数。只有在我们需要的时候才执行求值,否则是不会运行的,对应的Main要领中我们需要凭据如下方法改削:
这里我们并不需要把DoOneThing要领的返回类型改失,如果这样的话。在现有项目上使用函数式编程就会显得太麻烦了。这里我们仅仅只需要操作匿名函数就可以办到了,下面我们可以看最后的执行效果:
DoOneThing要领并没有执行,因为DoSomeThing中根柢没有确定使用这个变量,这样我们就能够节省下这部分计算的时间,但是事实上我们还没有结束,实际的开发中我们可能需要多次使用这个值,好比下面我们改削DoSomeThing要领:
并且在Main要领中挪用DoSomeThing要领时将第一个参数改成true,然后执行我们就可以看到下面的输出功效:
DoOneThing要领被执行了两次,固然我们可以操作局部变量生存,可能你会这么写:
如果这么写,那么我们的惰性求值就没有任何意义了,因为一进入这个要领就执行了这个要领,跟通报参数时直接将运算后的功效赋值给b没有任何区别了。固然也有其他一些技巧可以制止,但是这些技巧可不是下面要讲的内容,我们可以将其封装起来,好比我们可以写个LazyS<T>类:
我们可以看到在结构要领部分我们将对应的函数作为参数接收并生存到function中,只有再挪用Value时候会执行该函数并将值生存,并且不才次挪用时,如果已经求值过则直接返回缓存过的值,这样就能够制止反复的执行了,对应的我们还要改削DoSomeThing要领和Main要领:
最终执行后我们可以看到仅执行了一次DoOneThing要领: