I'm pretty sure there's no better way to do this but I thought a consensus on here might be nice. Let me know what you think.
At first glance it seems to be ok but one could assume that he/she is always getting either the value or the default value. If one would get the default value for e.g if the dictionary is empty, why shouldn't he/she get the default value if the dictionary is null
or the key
is null
?
If this isn't the way the method should work, then you need some documentation which cleary states the purpose and any expected exceptions.
Now, what happens if the method is called either like so
Dictionary<string, int> dict = null;
dict.GetValueOrDefault("someKey");
or (assuming the method lives in the "DictionaryExtensions" class)
Dictionary<string, int> dict = null;
DictionaryExtensions.GetValueOrDefault(dict, "someKey");
sure you get a NullReferenceException
but is this the type of exception one would expect ? If I call a method with an parameter being null
I would expect to get either no exception or to get an ArgumentNullException
.
What about if the key
is null
? Sure you get an ArgumentNullException
but it takes some time because it is thrown at the FindEntry()
method of the Dictionary
and this is also shown in the StackTrace
.
IMO it would be better to check this cases inside the GetValueOrDefault()
method and throw the exceptions there.
public static TValue GetValueOrDefault<TKey, TValue>(this Dictionary<TKey, TValue> dictionary, TKey key, TValue defaultValue = default(TValue))
{
if (dictionary == null) { throw new ArgumentNullException(nameof(dictionary)); } // using C# 6
if (key == null) { throw new ArgumentNullException(nameof(key)); } // using C# 6
TValue value;
return dictionary.TryGetValue(key, out value) ? value : defaultValue;
}
public static TValue GetValueOrDefault<TKey, TValue>(this Dictionary<TKey, TValue> dictionary, TKey key, TValue defaultValue = default(TValue)) => dictionary.TryGetValue(key, out var value) ? value : defaultValue;
\$\endgroup\$=>
is perfectly maintainable. \$\endgroup\$