foreach (Action action in actions)
action();
}
缓存技术
怎样使用闭包来实现缓存。如果我们创建了一个用于缓存的接收函数就可以实现缓存,并返回一个在一段时间内缓存结果的新函数。以下列表显示的例子:
public static Func<T> Cache<T>(this Func<T> func, int cacheInterval)
{
var cachedValue = func();
var timeCached = DateTime.Now;
Func<T> cachedFunc = () => {
if ((DateTime.Now - timeCached).Seconds >= cacheInterval)
{
timeCached = DateTime.Now;
cachedValue = func();
}
return cachedValue;
};
return cachedFunc;
}
变量 cacheInterval, cachedValue 和 timeCached 绑定到缓存的函数并作为函数的一部分。这个可以让我们记住最后的值并确认被缓存多长时间。
下面的例子中我们可以看到如何使用这个扩展来缓存函数值和返回当前时间:
Func<DateTime> now = () => DateTime.Now;
Func<DateTime> nowCached = now.Cache(4);
Console.WriteLine("\tCurrent time\tCached time");
for (int i = 0; i < 20; i++)
{
Console.WriteLine("{0}.\t{1:T}\t{2:T}", i + 1, now(), nowCached());
Thread.Sleep(1000);
}
惰性求值
C#语言小部分采用了非严格求值策略,大部分还是严格求值策略。
非严格求值的例子:逻辑或
static void NonStricteva luation()
{
bool ret = true || DoSomeThing() > 0;
&n