C#中的延迟执行如何在C#中实现自己的延迟执行机制?所以我举个例子:stringx=DoFoo();是否有可能执行一些魔术,以便在我“使用”x之前DoFoo不会执行?你可以使用lambdas/delegates:Funcdoit=()=>DoFoo();//-或-Funcdoit=DoFoo;稍后您可以像调用方法一样调用doit:stringx=doit();我想你可以你得到的最接近的是:Lazyx=DoFoo;字符串y=x;//"use"x的定义类似于Lazy(未测试):publicclassLazy{privatereadonlyFuncfunc;私有布尔有值;私有T值;publicLazy(Funcfunc){this.func=func;this.hasValue=false;}publicstaticimplicitoperatorLazy(Funcfunc){returnnewLazy(func);}publicstaticimplicitoperatorT(Lazylazy){if(!lazy.hasValue){lazy.value=lazy.func();lazy.hasValue=true;}返回惰性值;不幸的是,编译器的类型推断算法似乎无法自动推断出Func的类型,因此无法与隐式转换运算符匹配。我们需要显式声明委托的类型,这会使赋值语句更加冗长://这些都不会编译...Lazyx=DoFoo;懒惰的y=()=>DoFoo();惰性z=delegate(){returnDoFoo();};//这些都有效...Lazya=(Func)DoFoo;惰性b=(Func)(()=>DoFoo());惰性c=newFunc(DoFoo);newFunc(()=>DoFoo());懒惰e=新懒惰(DoFoo);懒惰f=newLazy(()=>DoFoo);一种选择是使用Lazy类,它以前来自ParallelExtensions库,现在是.NetFramework4.0的一部分。它允许您以线程感知的方式延迟处理数据。虽然有点脏,但您始终可以使用yield关键字:publicIEnumerableDoFoo(){Console.WriteLine("doingfoo");收益回报10;}[测试]publicvoidTestMethod(){varx=DoFoo();Console.WriteLine("获取了foo?");Console.WriteLine(x.First());}不是传递字符串x,而是传递一个委托给你一个StringFuncfooFunc=()=>DoFoo();为什么不直接调用“DoFoo()”直到你想要呢?--edit我的意思是,你所说的“使用”是什么意思例如,如果你想在调用它时调用.ToString(),你总是可以继承那个类并在那里实现你的功能(但这将是非常不直观的恕我直言).您几乎描述了LINQ的实际应用。linq查询描述了如何获取数据,但只有在查询迭代时才检索(调用DoFunc)数据。考虑是否可以更改设计以接受需要字符串IQueryable。以上就是《C#学习教程:C#延迟执行》的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处:
