UserString is the most simple way to attach data to an object: you can only store strings.
Next up is the UserDictionary, in which you can store key-value pairs. The keys are always strings, but the values can be may different types, including other dictionaries.
The most complex way to attach data is to use a custom UserData class, which needs to be able to read and write itself to file. With this, you can do anything that is serializable.
Each of them caters to specific use cases. Don’t use the more complex way to achieve something simple is what I would say. Personally, I always use the UserDictionary and have never had the need for the more complex UserData.