C#中的延迟执行

我怎样才能在C#中实现自己的延迟执行机制?

所以我举例说:

string x = DoFoo(); 

是否有可能执行一些魔法,以便在我“使用”x之前DoFoo不会执行?

你可以使用lambdas / delegates:

 Func doit = () => DoFoo(); // - or - Func doit = DoFoo; 

稍后你可以像一个方法一样调用doit

 string x = doit(); 

我认为你能得到的最接近的是这样的:

 Lazy x = DoFoo; string y = x; // "use" x 

Lazy的定义类似(未经测试):

 public class Lazy { private readonly Func func; private bool hasValue; private T value; public Lazy(Func func) { this.func = func; this.hasValue = false; } public static implicit operator Lazy(Func func) { return new Lazy(func); } public static implicit operator T(Lazy lazy) { if (!lazy.hasValue) { lazy.value = lazy.func(); lazy.hasValue = true; } return lazy.value; } } 

不幸的是,似乎编译器的类型推理算法无法自动推断Func的类型,因此无法将其与隐式转换运算符匹配。 我们需要显式声明委托的类型,这使得赋值语句更加冗长:

 // none of these will compile... Lazy x = DoFoo; Lazy y = () => DoFoo(); Lazy z = delegate() { return DoFoo(); }; // these all work... Lazy a = (Func)DoFoo; Lazy b = (Func)(() => DoFoo()); Lazy c = new Func(DoFoo); Lazy d = new Func(() => DoFoo()); Lazy e = new Lazy(DoFoo); Lazy f = new Lazy(() => DoFoo); 

一种选择是使用Lazy类,以前来自并行扩展库,现在是.Net Framework 4.0的一部分。

  • 参考: http : //msdn.microsoft.com/en-us/library/dd642331(VS.100).aspx

它允许您以线程感知的方式延迟过程数据。

虽然它有点脏,但你总是可以使用yield关键字:

 public IEnumerable DoFoo() { Console.WriteLine("doing foo"); yield return 10; } [Test] public void TestMethod() { var x = DoFoo(); Console.WriteLine("foo aquired?"); Console.WriteLine(x.First()); } 

而不是传递字符串x ,传递一个委托给你一个字符串

 Func fooFunc=()=>DoFoo(); 

为什么不直接调用’DoFoo()’直到你想要?

– 编辑

我的意思是,你是什么意思“使用”

例如,如果你想在调用’.ToString()’时调用它,你总是可以inheritance该类并在那里实现你的函数(但这将是非常不直观的恕我直言)。

你几乎描述了LINQ的实际应用。 linq查询描述了如何获取数据,但只有在迭代查询时才会检索数据(调用DoFunc)。 考虑是否可以将设计更改为接受需要string IQueryable