Foundatio icon indicating copy to clipboard operation
Foundatio copied to clipboard

DataDictionary.Empty is not protected by potential bugs.

Open frabe1579 opened this issue 3 years ago • 3 comments
trafficstars

I've found a potential source of bugs: the class Foundatio.Utility.DataDictionary exposes a static readonly field Empty to represent empty dictionaries, but it's instance is not readonly, so values can be added to Empty causing potential bugs. The current declaration is:

public static readonly DataDictionary Empty = new();

A new safe declaration shoud be

public static DataDictionary Empty => new();

This at least returns always empty dictionaries, but creates a new instance at every call. Another approach should be to re-implement DataDictionary with explicit implementation of IDictionary and IReadOnlyDictionary, or something else.

frabe1579 avatar Oct 31 '22 12:10 frabe1579

Yes, we should work on making empty be read-only. @ejsmith thoughts on above, kind of would be nice to make it truly readonly instead of returning a new instance. But would take a little bit of work.

niemyjski avatar Oct 31 '22 12:10 niemyjski

Yeah, this is an issue. We would definitely want to return an empty read only instance and it should be the same instance for all usages to avoid allocating a dictionary.

ejsmith avatar Oct 31 '22 14:10 ejsmith

Maybe a IReadOnlyDictionary<,>, with appropriate extension methods, should be used when exposed for example on IQueueEntry<>, but I don't know if it's used in other code.

frabe1579 avatar Oct 31 '22 14:10 frabe1579