From 9f6b9d154e6580109d464f98ee0d8fa1d4a66bd2 Mon Sep 17 00:00:00 2001 From: Stephen Toub Date: Wed, 25 Nov 2020 18:05:11 -0500 Subject: [PATCH] Remove allocations from `OptionsCache` (#45229) --- .../src/OptionsCache.cs | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/src/libraries/Microsoft.Extensions.Options/src/OptionsCache.cs b/src/libraries/Microsoft.Extensions.Options/src/OptionsCache.cs index b4094fe54de20..53fb764ef9bf6 100644 --- a/src/libraries/Microsoft.Extensions.Options/src/OptionsCache.cs +++ b/src/libraries/Microsoft.Extensions.Options/src/OptionsCache.cs @@ -34,8 +34,20 @@ public virtual TOptions GetOrAdd(string name, Func createOptions) { throw new ArgumentNullException(nameof(createOptions)); } + name = name ?? Options.DefaultName; - return _cache.GetOrAdd(name, new Lazy(createOptions)).Value; + Lazy value; + +#if NETCOREAPP + value = _cache.GetOrAdd(name, static (name, createOptions) => new Lazy(createOptions), createOptions); +#else + if (!_cache.TryGetValue(name, out value)) + { + value = _cache.GetOrAdd(name, new Lazy(createOptions)); + } +#endif + + return value.Value; } /// @@ -50,8 +62,12 @@ public virtual bool TryAdd(string name, TOptions options) { throw new ArgumentNullException(nameof(options)); } - name = name ?? Options.DefaultName; - return _cache.TryAdd(name, new Lazy(() => options)); + + return _cache.TryAdd(name ?? Options.DefaultName, new Lazy( +#if !NETCOREAPP + () => +#endif + options)); } /// @@ -59,10 +75,7 @@ public virtual bool TryAdd(string name, TOptions options) /// /// The name of the options instance. /// Whether anything was removed. - public virtual bool TryRemove(string name) - { - name = name ?? Options.DefaultName; - return _cache.TryRemove(name, out Lazy ignored); - } + public virtual bool TryRemove(string name) => + _cache.TryRemove(name ?? Options.DefaultName, out _); } }