Ok, consider this common idiom that most of us have used many times (I assume):
class FooBarDictionary
{
private Dictionary fooBars;
Lazy Loading
http://en.wikipedia.org/wiki/Lazy_loading
It sort of depends why you're doing it - the idiom is one I've seen be called memoization, caching, initialisation on demand, create on first use. Normally I call the method "ensureFoo" rather than "GetOrCreate"
... I've got a DefaultingDictionary<> which does about this. As a bonus
The extensions .AsDefaulting
can be used to transparently use any IDictionary<>
as a defaulting one, so you can opt to use any dictionary (even e.g. obtained from a thirdparty API) as a defaulting one, and the underlying container will be updated with any 'auto-vivified' items.
IDictionary<string, MyItem> dict = LoadFromDatabase();
// using a fixed value
SomeFunc(dict.AsDefaulting(defaultItem));
// using an independent generator function
var defaulting = dict.AsDefaulting(() => new MyItem { Id = System.Guid.NewGuid() });
// using a keydepedent generator function
var defaulting = dict.AsDefaulting(key => LazyLoadFromDatabase(key));
are included:
I always call such functions obtainSomething()
.
I'm unsure of overall programming name for the high level pattern, but Perl has this wonderful behavior called Autovivification - namely, automatically creating hash (map) key with undefined value when you're querying the value of non-existing key in the hash.