上述示例代码中有三个版本的函数记忆化。调用像下面这样
public static string Greeting(string name){
return $"Warm greetings {name}, the time is {DateTime.Now.ToString("hh:mm:ss")}";
}
public static void RunDemoMemoization()
{
var greetingMemoize = Memoize<string, string>(Greeting);
Console.WriteLine(greetingMemoize("Richard"));
Console.WriteLine(greetingMemoize("Paul"));
Console.WriteLine(greetingMemoize("Richard"));
}
线程安全字典ConcurrentDictionary可以保证只向集合里添加一个相同值,但函数求值可能会被执行多次,所以利用.NET4之后的延迟对象加载技术。在真正需要使用对象时候才去实例化(通过访问延迟对象的Value属性),而且是线程安全的。
补充一个,以前写设计模式时,单例模式的创建方式,第四种,延迟+线程安全的单例模式,传送门,设计模式速查手册
public sealed class Singleton{
private static readonly Lazy<Singleton> lazy =
new Lazy<Singleton>(() => new Singleton(), true); //#A
public static Singleton Instance => lazy.Value;
private Singleton()
{ }
}
to be contiued!
下集:不可变性
写给普通:
花有重开日,人无再少年
小时候快乐是本能,长大后快乐是本事